From dbd66ee7e4594f714a6e8b0a00c346de839b92d8 Mon Sep 17 00:00:00 2001 From: John Goerzen Date: Tue, 11 Oct 2005 14:30:12 +0000 Subject: [PATCH] Import upstream gpsbabel version 1.2.7 --- Makefile | 293 +- README | 411 +- an1.c | 75 +- bcr.c | 504 + cetus.c | 323 +- chkdoc | 2 +- coastexp.c | 2 +- coto.c | 415 + csv_util.c | 301 +- defs.h | 74 +- discard.c | 141 + easygps.c | 1 + filter_skeleton.c | 77 + filter_vecs.c | 14 +- formspec.c | 65 + garmin.c | 4 +- garmin_tables.c | 1 + gdb.c | 1694 ++++ geo.c | 2 +- geoniche.c | 14 +- glogbook.c | 26 +- google.c | 24 +- gpsutil.c | 5 +- gpx.c | 212 +- hiketech.c | 26 +- hsa_ndv.c | 11 +- html.c | 11 +- igc.c | 6 +- intdoc/SA2003_an1_dump.pl | 19 +- internal_styles.c | 92 +- jeeps/garminusb.h | 1 + jeeps/gps.h | 1 + jeeps/gpsapp.c | 83 +- jeeps/gpsapp.h | 1 + jeeps/gpslibusb.c | 9 +- jeeps/gpsprot.h | 1 + jeeps/gpsserial.c | 4 +- jeeps/gpsusbwin.c | 4 +- kml.c | 211 +- lowranceusr.c | 665 +- maggeo.c | 9 +- magnav.c | 2 +- magproto.c | 116 +- main.c | 5 +- mapsend.c | 2 +- mapsource.c | 16 +- mingw/Makefile | 2 +- mingw/mkwintesto.c | 9 +- mingw/wintesto.cmd | 186 +- mkshort.c | 3 + msvc/GPSBabel.dsp | 1516 +-- msvc/mkwintesto.dsp | 100 + navicache.c | 22 +- netstumbler.c | 2 +- nmea.c | 270 +- overlay.c | 23 +- palmdoc.c | 18 +- pathaway.c | 142 +- pcx.c | 2 +- psitrex.c | 7 +- reference/all.usr | Bin 0 -> 2941 bytes reference/coastexp.ref | 20 +- reference/cototest.style | 33 + reference/cototestmarker.gpx | 22 + reference/cototestmarker.pdb | Bin 0 -> 550 bytes reference/cototesttrack.csv | 135 + reference/cototesttrack.pdb | Bin 0 -> 9800 bytes reference/dop-test.gpx | 17 + reference/enchilada.usr | Bin 0 -> 2977 bytes reference/expertgps.gpx | 1131 +++ reference/fugawi.notime.txt | 19 + reference/fugawi.ref | 0 reference/fugawi.ref.txt | 19 + reference/fugawi.time.ref.txt | 16 + reference/fugawi.time.txt | 16 + reference/gc/GC7FA4.gpx | 151 + reference/gc/GCGCA8.gpx | 103 + reference/gdb-sample.gdb | Bin 0 -> 122965 bytes reference/gdb-sample.gpx | 13594 ++++++++++++++++++++++++++ reference/googmapjs.sh | 4 +- reference/igc1_gpx.out | 241 +- reference/igc2_gpx.out | 54 +- reference/ignoreicons.usr | Bin 0 -> 2901 bytes reference/lowrance.usr | Bin 353 -> 353 bytes reference/mxf.mxf | 18 +- reference/route/bcr-sample.bcr | 36 + reference/route/bcr-sample.gpx | 121 + reference/route/bcr-sample2.bcr | 36 + reference/route/tef_xml.mps | Bin 12934 -> 0 bytes reference/route/tef_xml.sample.gpx | 1498 +++ reference/track/fugawi.txt | 74 + reference/track/garmin_logbook.xml | 2047 ++++ reference/track/i65.anr.gpx | 3306 +++---- reference/track/pathaway.gpx | 1998 ++++ reference/track/pathaway.mps | Bin 15468 -> 0 bytes reference/track/trackfilter-new.gpx | 280 + reference/track/trackfilter.gpx | 269 + reference/track/tracks.gpx | 128 +- reference/track/vitosmt_t.gpx | 2203 +++++ reference/vitosmt.gpx | 2200 +++++ reference/vitosmt.smt | Bin 0 -> 15192 bytes reverse_route.c | 2 +- route.c | 7 +- smplrout.c | 11 +- strptime.c | 1020 ++ strptime.h | 33 + style/README.style | 68 + style/fugawi.style | 8 +- style/gpsdrivetrack.style | 27 + style/openoffice.style | 47 + style/s_and_t.style | 2 + tef_xml.c | 10 +- testc | 56 + testo | 110 +- text.c | 10 +- tmpro.c | 6 +- tomtom.c | 12 +- tools/mkcapabilities | 27 + tools/mkchanges | 2 +- tpg.c | 3 +- trackfilter.c | 763 ++ util.c | 95 +- uuid.c | 2 +- vecs.c | 50 +- vitosmt.c | 413 + vtesto | 9 + waypt.c | 42 +- xmlgeneric.c | 13 +- xmlgeneric.h | 2 +- xmltag.c | 131 + 130 files changed, 37636 insertions(+), 3411 deletions(-) create mode 100644 bcr.c create mode 100644 coto.c create mode 100644 discard.c create mode 100644 filter_skeleton.c create mode 100644 formspec.c create mode 100644 gdb.c create mode 100644 msvc/mkwintesto.dsp create mode 100644 reference/all.usr create mode 100644 reference/cototest.style create mode 100644 reference/cototestmarker.gpx create mode 100644 reference/cototestmarker.pdb create mode 100644 reference/cototesttrack.csv create mode 100644 reference/cototesttrack.pdb create mode 100644 reference/dop-test.gpx create mode 100644 reference/enchilada.usr create mode 100644 reference/expertgps.gpx create mode 100644 reference/fugawi.notime.txt create mode 100644 reference/fugawi.ref create mode 100644 reference/fugawi.ref.txt create mode 100644 reference/fugawi.time.ref.txt create mode 100644 reference/fugawi.time.txt create mode 100644 reference/gc/GC7FA4.gpx create mode 100644 reference/gc/GCGCA8.gpx create mode 100644 reference/gdb-sample.gdb create mode 100644 reference/gdb-sample.gpx create mode 100644 reference/ignoreicons.usr create mode 100644 reference/route/bcr-sample.bcr create mode 100644 reference/route/bcr-sample.gpx create mode 100644 reference/route/bcr-sample2.bcr delete mode 100644 reference/route/tef_xml.mps create mode 100644 reference/route/tef_xml.sample.gpx create mode 100644 reference/track/fugawi.txt create mode 100644 reference/track/garmin_logbook.xml create mode 100644 reference/track/pathaway.gpx delete mode 100644 reference/track/pathaway.mps create mode 100644 reference/track/trackfilter-new.gpx create mode 100644 reference/track/trackfilter.gpx create mode 100644 reference/track/vitosmt_t.gpx create mode 100644 reference/vitosmt.gpx create mode 100644 reference/vitosmt.smt create mode 100644 strptime.c create mode 100644 strptime.h create mode 100644 style/gpsdrivetrack.style create mode 100644 style/openoffice.style create mode 100644 testc create mode 100644 tools/mkcapabilities create mode 100644 trackfilter.c create mode 100644 vitosmt.c create mode 100644 vtesto create mode 100644 xmltag.c diff --git a/Makefile b/Makefile index 733986566..c181d7ec2 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,7 @@ +VERSIONU=1_2_7-beta08252005 +VERSIOND=1.2.7-beta08252005 +VERSIONU=1_2_7 +VERSIOND=1.2.7 # If you do not have libexpat and you have no use for reading any input # type that is XML-ish (i.e. gpx or geocaching.com's/loc) you can uncomment @@ -8,9 +12,15 @@ LIBEXPAT=-lexpat # -lefence # USB may required non-standard libraries (like libusb) be installed # and may not be available on all OSes. Uncomment this to remove the key # parts of USB from the build. -INHIBIT_USB=#-DNO_USB LIBUSB=-lusb +# Space is significant, because MSVC wants no space between switch and arg (-Fofoo.o) +# but cc/gcc does: +# $(OUTPUT_SWITCH)main.o +# becomes -o main.o (gcc) +# or -Fomain.o (cl.exe) +OUTPUT_SWITCH=-o # + # # Enable either or both of these as you wish. # @@ -28,9 +38,9 @@ FMTS=magproto.o gpx.o geo.o mapsend.o mapsource.o garmin_tables.o \ ozi.o nmea.o text.o html.o palmdoc.o netstumbler.o hsa_ndv.o \ igc.o brauniger_iq.o shape.o hiketech.o glogbook.o coastexp.o \ vcf.o overlay.o kml.o google.o lowranceusr.o an1.o tomtom.o \ - tef_xml.o maggeo.o pathaway.o + tef_xml.o maggeo.o pathaway.o vitosmt.o gdb.o bcr.o coto.o -FILTERS=position.o duplicate.o arcdist.o polygon.o smplrout.o reverse_route.o sort.o stackfilter.o +FILTERS=position.o duplicate.o arcdist.o polygon.o smplrout.o reverse_route.o sort.o stackfilter.o trackfilter.o discard.o OSJEEPS=jeeps/gpslibusb.o JEEPS=jeeps/gpsapp.o jeeps/gpscom.o \ @@ -47,20 +57,28 @@ COLDSYNC=coldsync/util.o coldsync/pdb.o SHAPE=shapelib/shpopen.o shapelib/dbfopen.o LIBOBJS = queue.o route.o waypt.o filter_vecs.o util.o vecs.o mkshort.o \ - csv_util.o grtcirc.o vmem.o util_crc.o xmlgeneric.o uuid.o \ + csv_util.o strptime.o grtcirc.o vmem.o util_crc.o xmlgeneric.o \ + uuid.o formspec.o xmltag.o \ $(COLDSYNC) $(GARMIN) $(JEEPS) $(SHAPE) $(FMTS) $(FILTERS) OBJS = main.o $(LIBOBJS) .c.o: - $(CC) -c $(CFLAGS) $< -o $@ + $(CC) -c $(CFLAGS) $< $(OUTPUT_SWITCH)$@ all: gpsbabel +# +# Alternate makefile target for the case when you have no libusb and no +# need for Garmin/USB (60, 76C, VistaC, Quest, etc.) support. +# +usbfree: + make LIBUSB= INHIBIT_USB=-DNO_USB + gpsbabel: $(OBJS) - $(CC) $(CFLAGS) $(OBJS) -o gpsbabel $(LIBEXPAT) $(LIBUSB) -lm + $(CC) $(CFLAGS) $(OBJS) $(LIBEXPAT) $(LIBUSB) -lm $(OUTPUT_SWITCH)$@ main.o: - $(CC) -c $(CFLAGS) -DVERSION=\"$(VERSIOND)\" $< + $(CC) -c $(CFLAGS) -DVERSION=\"$(VERSIOND)\" $< $(OUTPUT_SWITCH)$@ clean: rm -f $(OBJS) gpsbabel gpsbabel.exe @@ -91,10 +109,6 @@ dep: (echo -n "internal_styles.c: mkstyle.sh " ; echo style/*.style ; /bin/echo -e '\t./mkstyle.sh > internal_styles.c || (rm -f internal_styles.c ; exit 1)' ) >> /tmp/dep echo Edit Makefile and bring in /tmp/dep -VERSIONU=1_2_6-beta06082005 -VERSIOND=1.2.6_beta06082005 -# VERSIONU=1_2_5 -# VERSIOND=1.2.5 release: cvs commit @@ -123,33 +137,49 @@ mac-release: tar cvzf gpsbabel-osx.tgz usr/bin/gpsbabel curl -u anonymous:anonymous --upload-file gpsbabel-osx.tgz ftp://upload.sf.net/incoming/ -# Machine generated from here down. +msvc-build: + make CC=@CL.EXE DEBUGGING="" EXTRA_CFLAGS="-nologo -W3 -WL -D__WIN32__ -I msvc/expat " OUTPUT_SWITCH="-Fo" $(OBJS) + echo $(OBJS) > objs.lst + LINK.EXE /NOLOGO @objs.lst ./msvc/expat/libexpat.lib /out:gpsbabel.exe +# Machine generated from here down. an1.o: an1.c defs.h queue.h gbtypes.h an1sym.h arcdist.o: arcdist.c defs.h queue.h gbtypes.h grtcirc.h +bcr.o: bcr.c defs.h queue.h gbtypes.h garmin_tables.h brauniger_iq.o: brauniger_iq.c defs.h queue.h gbtypes.h jeeps/gpsserial.h \ - jeeps/gps.h jeeps/gpsport.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h + jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h cetus.o: cetus.c defs.h queue.h gbtypes.h coldsync/palm.h coldsync/pdb.h coastexp.o: coastexp.c defs.h queue.h gbtypes.h xmlgeneric.h uuid.h copilot.o: copilot.c defs.h queue.h gbtypes.h coldsync/palm.h \ coldsync/pdb.h -csv_util.o: csv_util.c defs.h queue.h gbtypes.h csv_util.h grtcirc.h +coto.o: coto.c defs.h queue.h gbtypes.h csv_util.h coldsync/palm.h \ + coldsync/pdb.h +csv_util.o: csv_util.c defs.h queue.h gbtypes.h csv_util.h grtcirc.h \ + strptime.h delgpl.o: delgpl.c defs.h queue.h gbtypes.h +discard.o: discard.c defs.h queue.h gbtypes.h duplicate.o: duplicate.c defs.h queue.h gbtypes.h easygps.o: easygps.c defs.h queue.h gbtypes.h filter_vecs.o: filter_vecs.c defs.h queue.h gbtypes.h -garmin.o: garmin.c defs.h queue.h gbtypes.h jeeps/gps.h jeeps/gpsport.h \ - jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h \ - jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h \ - jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h \ - jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h \ - garmin_tables.h +formspec.o: formspec.c defs.h queue.h gbtypes.h +garmin.o: garmin.c defs.h queue.h gbtypes.h jeeps/gps.h jeeps/../defs.h \ + jeeps/gpsport.h jeeps/gpsserial.h jeeps/gps.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h garmin_tables.h garmin_tables.o: garmin_tables.c garmin_tables.h gcdb.o: gcdb.c defs.h queue.h gbtypes.h coldsync/palm.h coldsync/pdb.h +gdb.o: gdb.c defs.h queue.h gbtypes.h garmin_tables.h jeeps/gpsmath.h \ + jeeps/gps.h jeeps/../defs.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h geo.o: geo.c defs.h queue.h gbtypes.h xmlgeneric.h geoniche.o: geoniche.c defs.h queue.h gbtypes.h coldsync/palm.h \ coldsync/pdb.h @@ -166,21 +196,20 @@ hiketech.o: hiketech.c defs.h queue.h gbtypes.h xmlgeneric.h holux.o: holux.c defs.h queue.h gbtypes.h holux.h hsa_ndv.o: hsa_ndv.c defs.h queue.h gbtypes.h html.o: html.c defs.h queue.h gbtypes.h jeeps/gpsmath.h jeeps/gps.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h \ - jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h igc.o: igc.c defs.h queue.h gbtypes.h internal_styles.o: internal_styles.c defs.h queue.h gbtypes.h kml.o: kml.c defs.h queue.h gbtypes.h xmlgeneric.h lowranceusr.o: lowranceusr.c defs.h queue.h gbtypes.h +maggeo.o: maggeo.c defs.h queue.h gbtypes.h xmlgeneric.h magellan.h magnav.o: magnav.c defs.h queue.h gbtypes.h coldsync/palm.h \ coldsync/pdb.h magproto.o: magproto.c defs.h queue.h gbtypes.h magellan.h main.o: main.c defs.h queue.h gbtypes.h -tef_xml.o: tef_xml.c defs.h queue.h gbtypes.h xmlgeneric.h -pathaway.o: pathaway.c defs.h queue.h gbtypes.h \ - coldsync/palm.h coldsync/pdb.h csv_util.h mapsend.o: mapsend.c defs.h queue.h gbtypes.h mapsend.h magellan.h mapsource.o: mapsource.c defs.h queue.h gbtypes.h garmin_tables.h mkshort.o: mkshort.c defs.h queue.h gbtypes.h @@ -190,11 +219,13 @@ nmea.o: nmea.c defs.h queue.h gbtypes.h overlay.o: overlay.c defs.h queue.h gbtypes.h grtcirc.h ozi.o: ozi.c defs.h queue.h gbtypes.h csv_util.h palmdoc.o: palmdoc.c defs.h queue.h gbtypes.h jeeps/gpsmath.h jeeps/gps.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h \ - jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h \ - coldsync/palm.h coldsync/pdb.h + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h coldsync/palm.h coldsync/pdb.h +pathaway.o: pathaway.c defs.h queue.h gbtypes.h coldsync/palm.h \ + coldsync/pdb.h csv_util.h pcx.o: pcx.c defs.h queue.h gbtypes.h garmin_tables.h polygon.o: polygon.c defs.h queue.h gbtypes.h position.o: position.c defs.h queue.h gbtypes.h grtcirc.h @@ -210,118 +241,126 @@ shape.o: shape.c defs.h queue.h gbtypes.h shapelib/shapefil.h smplrout.o: smplrout.c defs.h queue.h gbtypes.h grtcirc.h sort.o: sort.c defs.h queue.h gbtypes.h stackfilter.o: stackfilter.c defs.h queue.h gbtypes.h +strptime.o: strptime.c strptime.h +tef_xml.o: tef_xml.c defs.h queue.h gbtypes.h xmlgeneric.h text.o: text.c defs.h queue.h gbtypes.h jeeps/gpsmath.h jeeps/gps.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h \ - jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h tiger.o: tiger.c defs.h queue.h gbtypes.h csv_util.h tmpro.o: tmpro.c defs.h queue.h gbtypes.h csv_util.h tomtom.o: tomtom.c defs.h queue.h gbtypes.h tpg.o: tpg.c defs.h queue.h gbtypes.h jeeps/gpsmath.h jeeps/gps.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h \ - jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h +trackfilter.o: trackfilter.c defs.h queue.h gbtypes.h strptime.h util.o: util.c defs.h queue.h gbtypes.h util_crc.o: util_crc.c uuid.o: uuid.c uuid.h vcf.o: vcf.c defs.h queue.h gbtypes.h jeeps/gpsmath.h jeeps/gps.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h \ - jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h + jeeps/../defs.h jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h \ + jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ + jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h \ + jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ + jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h vecs.o: vecs.c defs.h queue.h gbtypes.h csv_util.h +vitosmt.o: vitosmt.c defs.h queue.h gbtypes.h vmem.o: vmem.c defs.h queue.h gbtypes.h waypt.o: waypt.c defs.h queue.h gbtypes.h xcsv.o: xcsv.c defs.h queue.h gbtypes.h csv_util.h xmlgeneric.o: xmlgeneric.c defs.h queue.h gbtypes.h xmlgeneric.h +xmltag.o: xmltag.c defs.h queue.h gbtypes.h coldsync/pdb.o: coldsync/pdb.c coldsync/config.h coldsync/palm.h \ coldsync/pdb.h coldsync/util.o: coldsync/util.c coldsync/config.h coldsync/pconn/util.h \ coldsync/palm.h -jeeps/gpsapp.o: jeeps/gpsapp.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h -jeeps/gpscom.o: jeeps/gpscom.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h -jeeps/gpslibusb.o: jeeps/gpslibusb.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h jeeps/garminusb.h -jeeps/gpsmath.o: jeeps/gpsmath.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h jeeps/gpsdatum.h -jeeps/gpsmem.o: jeeps/gpsmem.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h jeeps/garminusb.h -jeeps/gpsprot.o: jeeps/gpsprot.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h -jeeps/gpsread.o: jeeps/gpsread.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h jeeps/gpsusbint.h -jeeps/gpsrqst.o: jeeps/gpsrqst.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h -jeeps/gpssend.o: jeeps/gpssend.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h jeeps/gpsusbint.h -jeeps/gpsserial.o: jeeps/gpsserial.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h jeeps/garminusb.h -jeeps/gpsusbread.o: jeeps/gpsusbread.c jeeps/gps.h defs.h queue.h \ - gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/garminusb.h \ +jeeps/gpsapp.o: jeeps/gpsapp.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h +jeeps/gpscom.o: jeeps/gpscom.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h +jeeps/gpslibusb.o: jeeps/gpslibusb.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/garminusb.h +jeeps/gpsmath.o: jeeps/gpsmath.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/gpsdatum.h +jeeps/gpsmem.o: jeeps/gpsmem.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/garminusb.h +jeeps/gpsprot.o: jeeps/gpsprot.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h +jeeps/gpsread.o: jeeps/gpsread.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/gpsusbint.h +jeeps/gpsrqst.o: jeeps/gpsrqst.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h +jeeps/gpssend.o: jeeps/gpssend.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/gpsusbint.h +jeeps/gpsserial.o: jeeps/gpsserial.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/garminusb.h +jeeps/gpsusbread.o: jeeps/gpsusbread.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/garminusb.h \ jeeps/gpsusbint.h -jeeps/gpsusbsend.o: jeeps/gpsusbsend.c jeeps/gps.h defs.h queue.h \ - gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h \ - jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h \ - jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h \ - jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h \ - jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/garminusb.h \ +jeeps/gpsusbsend.o: jeeps/gpsusbsend.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h jeeps/garminusb.h \ jeeps/gpsusbint.h jeeps/gpsusbstub.o: jeeps/gpsusbstub.c -jeeps/gpsutil.o: jeeps/gpsutil.c jeeps/gps.h defs.h queue.h gbtypes.h \ - jeeps/gpsport.h jeeps/gpsserial.h jeeps/gpssend.h jeeps/gpsread.h \ - jeeps/gpsutil.h jeeps/gpsapp.h jeeps/gpsprot.h jeeps/gpscom.h \ - jeeps/gpsfmt.h jeeps/gpsmath.h jeeps/gpsnmea.h jeeps/gpsmem.h \ - jeeps/gpsrqst.h jeeps/gpsinput.h jeeps/gpsproj.h jeeps/gpsnmeafmt.h \ - jeeps/gpsnmeaget.h +jeeps/gpsutil.o: jeeps/gpsutil.c jeeps/gps.h jeeps/../defs.h \ + jeeps/../queue.h jeeps/../gbtypes.h jeeps/gpsport.h jeeps/gpsserial.h \ + jeeps/gpssend.h jeeps/gpsread.h jeeps/gpsutil.h jeeps/gpsapp.h \ + jeeps/gpsprot.h jeeps/gpscom.h jeeps/gpsfmt.h jeeps/gpsmath.h \ + jeeps/gpsnmea.h jeeps/gpsmem.h jeeps/gpsrqst.h jeeps/gpsinput.h \ + jeeps/gpsproj.h jeeps/gpsnmeafmt.h jeeps/gpsnmeaget.h shapelib/dbfopen.o: shapelib/dbfopen.c shapelib/shapefil.h shapelib/shpopen.o: shapelib/shpopen.c shapelib/shapefil.h -internal_styles.c: mkstyle.sh style/README.style style/arc.style style/csv.style style/custom.style style/dna.style style/fugawi.style style/gpsdrive.style style/gpsman.style style/mapconverter.style style/mxf.style style/nima.style style/s_and_t.style style/saplus.style style/tabsep.style style/xmap.style style/xmapwpt.style +internal_styles.c: mkstyle.sh style/README.style style/arc.style style/csv.style style/custom.style style/dna.style style/fugawi.style style/gpsdrive.style style/gpsdrivetrack.style style/gpsman.style style/mapconverter.style style/mxf.style style/nima.style style/openoffice.style style/s_and_t.style style/saplus.style style/tabsep.style style/xmap.style style/xmapwpt.style ./mkstyle.sh > internal_styles.c || (rm -f internal_styles.c ; exit 1) diff --git a/README b/README index 164cb44fa..d858f61bc 100644 --- a/README +++ b/README @@ -61,14 +61,6 @@ COMMON USAGE gpsbabel -i magellan -f /dev/ttyS0 -o geo -F mag.loc gpsbabel -i magellan -f com1 -o geo -F mag.loc - PathAway (Palm) database - - PathAway is a Palm software designed for handling "most" GPS devices - (including BlueTooth). In this time (i mean 2005) a free tool - to convert this database is located on the homepage - of PathAway (www.pathaway.com). But i've read there ... for windows and - the output format was also very limited. - Optionally, you may specify "-s" in any command line. This causes the program to ignore any "short" names that may be present in the source data format and synthesize one from the long name. This @@ -85,10 +77,21 @@ COMMON USAGE ADVANCED USAGE - Argument are processed in the order they appear on the command line. - Input is cumulative. The input file type remains unchanged until a - new -i argument is seen. Files are read in the order they appear. - So you could merge three input files into one output file with: + Argument are processed in the order they appear on the command line + and are translated internally into a pipeline that data flows + through when executed. Normally one would: + - read from one input + - optionally apply filters + - write into one output + + but GPSBabel is flexible enough to allow more complicated + operations such as reading from several files (potentially of + different types), applying a filter, reading more data, then + write the merged data to multiple destinations. + + The input file type remains unchanged until a new -i argument + is seen. Files are read in the order they appear. So you could + merge three input files into one output file with: gpsbabel -i geo -f 1.loc -f 2.loc -f 3.loc -o geo -F big.loc @@ -102,13 +105,31 @@ ADVANCED USAGE ROUTE AND TRACK MODES - The presence of "-t" on the command line tells us to work with - tracks. The presence of "-r" tells us to work with routes. - Tracks and routes are advanced features and don't try to - handle every possible hazard that can be encountered during a - conversion. If you're merging or converting files of similar - limitations, things work very well. The presence of "-s" on - the command line tends to creat havoc because tracks and routes. + Most formats will make reasonable attempt to work transparently + with waypoints, tracks, and routes. Some formats, like 'garmin' + and 'magellan' require the '-t' flag to work with tracks and + '-r' to work with routes. '-w' is for waypoints, and is the + default. So if you wanted to read all data from your unit into + a gpx file, you might use a command like: + + gpsbabel -t -r -w -i magellan -f com1: -o gpx -F backup.gpx + + Tracks and routes are advanced features and don't try to + handle every possible hazard that can be encountered during a + conversion. If you're merging or converting files of similar + limitations, things work very well. + + Tracks and routes will sometimes be converted to a list of + waypoints when necessary, f.i. when writing into one of the CSV + formats. The inverse operation is not supported right now, so + reading the converted track back from CSV will always result in + a list of waypoints, not the original track. + + The presence of "-s" on the command line tends to creats havoc + on tracks and routes since many of these formats rely on + internal linkages between such points and renaming them may + break those linkages. In general, don't use "-s" when tracks or + routes are present. THE FORMATS @@ -143,13 +164,23 @@ THE FORMATS MAGELLANX - The SD card format used by the Magellan Explorist 300, 400, and 500. + The SD card format used by the Magellan Explorist 400, 500, and 600. It's identical to the Magellan SD format used by Meridian, but allows longer waypoint names. You should name any file created with this format with a ".upt" extension so the firmware can read it. + MAGGEO + + The SD card format used by the Magellan Explorist 400, 500, and + 600 to describe geocaches. Notice what while the format can + hold an infinite number of geocaches, the unit will read and + silently discard all but 200 geocache POIs at a time. + + You should name any file created with this format with a ".gs" + extension so the firmware can read it. + GARMIN Waypoint serial upload and download works reliably under both @@ -162,16 +193,11 @@ THE FORMATS else (PDA hotsync programs, gpsd, getty, pppd, etc.) is using the serial port. - New in GPSBabel 1.2.4 is USB support, but only under Windows. - It's reported successful with VistaC, SummitC, 60C, 60CS, 76C, - 76CS, and 96C. Some users report success with StreetPilot 2610 - and some do not, but nobody's followed up with details on that. - - Quest is known to not work, not becuase of USB problems, but - rather becuase it only implements a new waypoint protocol that's - seemingly only available on that model. If you have a Quest and - would like to see it supported and can provide patches or a loan - of the equipment for a few days, please contact Robert Lipe. + GPSBabel supports the USB Garmins under Windows and on Linux and + OS/X via libusb. It's reported successful with VistaC, SummitC, + 60C, 60CS, 76C, 76CS, 96C, and Quest. Some users report success + with StreetPilot 2610 and some do not, but nobody's followed up + with details on that. Currently, only a single USB unit at a time can be supported. The device name to use on the command line is "usb:" Thus, to read @@ -185,6 +211,13 @@ THE FORMATS gpsbabel -D9 -i garmin -f usb: -o gpx -F blah.gpx + Custom icons are supported on units that support that. Neither + GPSBabel nor your firmware know what is associated with any + given slot number. They don't know that the picture you placed + in the first slot is a happy face, they only know they're in the + lowest numbered slot. GPSBabel names the them consistently with + Mapsource, so they are named 'Custom 0' through 'Custom 23'. + GPSMAN GPS Manager can read and write formats that this converter doesn't @@ -221,8 +254,16 @@ THE FORMATS The Lowrance iFinder GPS series has the unique capability to output its data to an MMC card. The data is saved to the card as a .USR file and can be read by your computer using a card - reader. Currently only reading and writing of waypoints (no - routes or tracks) is supported. + reader. Waypoints, routes, tracks are supported. By default, + Event marker icons are converted to waypoints. Symbols tend + to get lost in the translation. + + Additional options: + ignoreicons - don't convert icons to waypoints + merge - (USR output) merge all tracks into a single + track with segments + break - (USR input) break track segments into separate + tracks XMap @@ -462,6 +503,12 @@ THE FORMATS GpsDrive way.txt file format. A space seperated format file. Tested against GpsDrive v 1.30 found @ http://www.kraftvoll.at/software. Contributed by Alan Curry. + + GPSDRIVETRACK + + Format used by GpsDrive to save tracks. Like GPSDRIVE a space + seperated format file. See above for a link to GpsDrive. + Contributed by Tobias Minich. Geocaching DB @@ -512,8 +559,10 @@ THE FORMATS s_and_t - This is a CSV format for Microsoft Streets and Trips. Detailed - instructions on how to import to it, preserving hyperlinks, are at + This is a format for importing into Microsoft Streets and Trips. + It's been exercised on versions 2003, 2004, and 2005. Detailed + instructions on how to use it, including preserving hyperlinks, + are at http://www.gpsbabel.org/formats/s_and_t/Importing_into_Microsoft_Streets_and_Trips_2003.html @@ -530,8 +579,24 @@ THE FORMATS Fugawi - This was a requested CSV format. It's unknown which version of - which software it works with. + This was a requested CSV format, *not* the proprietary binary format + used by Fugawi. Like any other CSV format, GPSBabel cannot read tracks + in this format, but converting a track into it and then importing as + track in Fugawi works. + + It is known to work with Fugawi V3.1.4.635. When importing/exporting + waypoints, one has to specify the order of fields as follows (names of + fields may depend on the language used by Fugawi): + - Name + - Comment + - Description + - Latidude + - Longitude + - Altitude (metres) + - Date (yyyymmdd/yymmdd) + - Time of day (hhmmss) + When importing tracks, use "[ignore]" instead of "Name", "Comment" and + "Description". http://www.fugawi.com/ @@ -782,26 +847,38 @@ THE FORMATS useful: #!/bin/sh - FROM="233 S. Wacker, Chicago, IL" - TO="1060 W. Addison, Chicago, IL" + FROM="233 S. Upper Wacker Dr, Chicago, IL" + TO="1060 W. Addison St, Chicago, IL" wget -O - "http://maps.google.com/maps?q=$FROM to $TO&output=js" \ 2>/dev/null >google_map.js gpsbabel -i google -f google_map.js -o gpx -F google_map.gpx + + Note that Internet Explorer has been observed to damage the + XHTML beyond recognition so use a better browser to save the + pages such as Firefox or Mozilla. + + TEF + + TEF, internal called "TourExchangeFormat", is a XML based + export format, used by Map&Guide "Motorrad-Routenplaner 2005/06". + Another posibility to exchange data with this are the .bcr files, + which are sopprted by GPSbabel in both directions (see BCR). + Via XML this software can only export routing data. + So we don't support writing. - TourExchangeFormat - - XML based export format, used by Map&Guide - "Motorrad-Routenplaner". This software can only export routing data. - So we don't support writing. + With the option "routevia" you can eliminate calculated route + points from tef source file. + gpsbabel -r -i tef,routevia -f in.xml -o gpx -F out.gpx + PathAway - - PathAway is a Palm software designed for handling "most" GPS devices - (including BlueTooth). In this time (i mean 2005) a free tool - to convert this database is located on the homepage - of PathAway (www.pathaway.com). But i've read there ... for windows and - the output formats are also very limited. + + PathAway is a Palm software designed for handling "most" GPS + devices (including BlueTooth). In this time (i mean 2005) a free + tool to convert this database is located on the homepage of + PathAway (www.pathaway.com). But i've read there ... for windows + and the output formats are also very limited. AN1 @@ -839,16 +916,94 @@ THE FORMATS the icon. It should be 22x22 and 16 colors, and have the same name (not including the extension) as the .ov2 file. -DATA FILTERS + VitoSMT + + Vito Navigator II is a Pocket PC GPS application. This format reads + a Vito Navigator II .SMT track file and can work in either waypoint + or track mode. The speed, heading and Dilution of Position data + is written in the notes field. - GPSBabel supports data filtering. Data filters are invoked from - the command line via the '-x' option. It should be noted that - data filters are invoked in the order they appear on the command - line and can be used in intermittently between several variations - of input and output functions. It should also be noted that - filtering data from different input types can sometimes produce - undesirable results due to differences in the native data formats. + Support for writing .SMT tracks is very experimental and may crash + VitoNavigator II on the Pocket PC. + GDB + + Support for the "Garmin GPS Database" format used by default in + MapSource versions since release 6.0. By default we create gdb's + of version 2. Version 2 is used in Mapsource 6.3 and 6.5. + + Garmin GPS database is an undocumented file format. The + basic info for this module comes from the existing MapSource + conversion code. + + Additional options: + + ver - set the data format version of the output file + (currently 1 or 2); 2 is our default. + via - Drop hidden route points (means calculated stuff) + cat - default category on output (1..16) + + BCR + + This file format (extension .bcr) is used in + "Motorrad Routenplaner 2002-..." by Map&Guide. It is a route-onle + format. If you own a newer release (2005...) you can also use + the XML export and convert via + "gpsbabel ... -i tef ..." to your preferred format. + + May be there are other products from Map&Guide using the format. + + Coordinates are stored in Mercator format. The calculation between + this and our internal format can result in visible differences. + Experience reports are welcome. + + Options: + + index - If more then one route are present in source data, with + this option you can determine, which of this should used + for the output. The range is 1 to number routes in input. + If you don't use this, only the first route will be + converted. + name - Not every input format has a real name for routes in + their data. So you can give the route a nice name. + radius - Overwrites the default value of 6371000.0 meters for + the earth radius. My be this can help to reduce + differences. + + An example with all options: + + gpsbabel -r \ + -i gpx -f in.gpx + -o bcr,index=1,name="From A to B",radius=6371012 \ + -F a_to_b.bcr + + OPENOFFICE + Tab seperated export-all (except geocaching data) file format. + Intended to serve as source for number-processing applications + like OpenOffice, Ploticus and others. Tab was chosen as delimiter + because it is a) supported by both OpenOffice and Ploticus and + b) is not ',', so you can use 'sed -i "s/./,/g" .csv' to adapt it to + locales where ',' is used as decimal seperator. + Contributed by Tobias Minich. + +DATA FILTERS + + GPSBabel supports data filtering. Data filters are invoked from + the command line via the '-x' option. It should be noted that + data filters are invoked in the internal pipeline at the point + that corresponds to their position on the command. This implies + that specifying a filter before reading any data ('-x + -f '), despite being legal, will not have any effect. The + advantage is that filters can be used intermittently between + several variations of input and output functions. It should + also be noted that filtering data from different input types can + sometimes produce undesirable results due to differences in the + native data formats. + + Beware that most filters only apply to a certain kind of + data. This is usually indicated below by referring to points, + tracks or routes in the first sentence which describes each + filter or in the table at http://www.gpsbabel.org/capabilities.html . POSITION @@ -1117,3 +1272,145 @@ DATA FILTERS -x stack,pop,append \ -o magellan -F fwaind.wpt + + TRACK + + ( !!! This filter always drops empty tracks !!! ) + + The track filter is a tool for manipulating track lists. + The following options are available: + + TITLE + + Gives the new track(s) a basic title. Basic means if more + than one track is created by filter the title will be + expanded with the date the new track. Special formats (see + UNIX date or strftime for details) are possible. + + gpsbabel -t \ + -i gpx -f in.gpx \ + -x track,pack,split,title="ACTIVE LOG-%D" \ + -o gpx -F out.gpx PACK + + MOVE + + Change the time of all trackpoints. This is useful if + your track has moved by one or more hours through a + time zone problem. The following example will shift + your track to be one hour later. + + gpsbabel -t \ + -i gpx -f in.gpx \ + -x track,move=+1h,pack,title="ACTIVE LOG" \ + -o gpx -F out.gpx + + START / STOP + + Filter tracks against time borders. All points outside + this range will be dropped. The date-time paramters + have to be in form of YYYYMMDDHHMMSS; but you may specify + only the most significant portion represented in the the + leftmost fields. See the example, where the time is + specified only through the hour. + + If you only want to get a track mapped on 20 july 2005 from + 10 am to 6pm, you should use this: + + gpsbabel -t \ + -i gpx -f in.gpx \ + -x track,start=2005072010,stop=2005072018 \ + -o gpx -F out.gpx + + PACK + + With this default option all tracks from input will be + packed into one track. If tracks overlaps in time, the + filter stops working. To pack all the tracks together + into one track and give it a name, use this: + + gpsbabel -t \ + -i gpx -f in.gpx \ + -x track,pack,title="ACTIVE LOG" \ + -o gpx -F out.gpx + + SPLIT + + The input track will be split into several tracks + depending on date of track points. If there is more + than one track, use the pack option before before + using this. + + To split a single tracks into separate tracks for each day + and name them, use this: + + gpsbabel -t \ + -i gpx -f in.gpx \ + -x track,split,title="ACTIVE LOG # %Y%m%d" \ + -o gpx -F out.gpx + + If the input has multiple tracks, pack them together before + splitting them back apart per day thusly: + + gpsbabel -t \ + -i gpx -f in.gpx \ + -x track,pack,split,title="ACTIVE LOG # %D" \ + -o gpx -F out.gpx + + Additionally you can add an interval to the split option. + With this the track will be split if the time between two + points is greater than this parameter. The interval must be + numeric and can be int days, hours, minutes or seconds, + expressed as one of the character "d", "h", "m", or "s". + If no trailing character is present, the units are assumed to + be in seconds. + + For example, to split a track based on an four hour interval, + use this: + + gpsbabel -t \ + -i gpx -f in.gpx \ + -x track,pack,split=4h,title="LOG # %c" \ + -o gpx -F out.gpx + + MERGE + + Merge puts all track points into one single track and + sort them by time. Points with identical time stamp + will be dropped !!! + + If you want to merge tracks from different devices + but from same trip, use this: + + gpsbabel -t \ + -i gpx -f john.gpx \ + -i gpx -f doe.gpx \ + -x track,merge,title="COMBINED LOG" \ + -o gpx -F john_doe.gpx + + DISCARD + + This filter 'fixes' gps data by discarding points with a hdop + and/or vdop over a set limit. If you give both the hdop and a + vdop options, by default points that exceed EITHER are discarded + (OR). This filter processes waypoints, tracks, and routes. + + HDOP (float) + + Points with a hdop exceeding the given value are discarded. + + VDOP (float) + + Points with a vdop exceeding the given value are discarded. + + HDOPANDVDOP + + Only useful if both hdop and vdop are given. Now logical AND + is used, i.e. only points exceeding both given values are + discarded. + + Example: gpsbabel \ + -i gpx -f in.gpx \ + -x discard,hdop=10,vdop=20,hdopandvdop \ + -o gpx -F out.gpx + + Contributed by Tobias Minich. diff --git a/an1.c b/an1.c index 63035f4c7..0b72ce59c 100644 --- a/an1.c +++ b/an1.c @@ -195,7 +195,7 @@ typedef struct { } an1_symbol_record; typedef struct { - an1_base base; + format_specific_data fs; short magic; long unk1; long lon; @@ -226,7 +226,7 @@ typedef struct { } an1_waypoint_record; typedef struct { - an1_base base; + format_specific_data fs; short magic; long unk0; long lon; @@ -235,7 +235,7 @@ typedef struct { } an1_vertex_record; typedef struct { - an1_base base; + format_specific_data fs; short magic; short unk1; short serial; @@ -261,6 +261,7 @@ void Destroy_AN1_Waypoint( void *vwpt ) { an1_waypoint_record *wpt = (an1_waypoint_record *)vwpt; xfree( wpt->name ); xfree( wpt->fontname ); + xfree( vwpt ); } void Copy_AN1_Waypoint( void **vdwpt, void *vwpt ) { @@ -275,14 +276,16 @@ void Copy_AN1_Waypoint( void **vdwpt, void *vwpt ) { static an1_waypoint_record *Alloc_AN1_Waypoint( ) { an1_waypoint_record *result = NULL; result = (an1_waypoint_record *)xcalloc( sizeof(*result), 1 ); - result->base.copy = Copy_AN1_Waypoint; - result->base.destroy = Destroy_AN1_Waypoint; + result->fs.type = FS_AN1W; + result->fs.copy = Copy_AN1_Waypoint; + result->fs.destroy = Destroy_AN1_Waypoint; + return result; } static an1_vertex_record *Alloc_AN1_Vertex(); void Destroy_AN1_Vertex( void *vvertex ) { - /* do nothing */ + xfree( vvertex ); } void Copy_AN1_Vertex( void **vdvert, void *vvert ) { @@ -295,8 +298,10 @@ void Copy_AN1_Vertex( void **vdvert, void *vvert ) { static an1_vertex_record *Alloc_AN1_Vertex() { an1_vertex_record *result = NULL; result = (an1_vertex_record *)xcalloc( sizeof( *result), 1 ); - result->base.copy = Copy_AN1_Vertex; - result->base.destroy = Destroy_AN1_Vertex; + result->fs.type = FS_AN1V; + result->fs.copy = Copy_AN1_Vertex; + result->fs.destroy = Destroy_AN1_Vertex; + return result; } @@ -305,6 +310,7 @@ static an1_line_record *Alloc_AN1_Line(); void Destroy_AN1_Line( void *vline ) { an1_line_record *line = (an1_line_record *)vline; xfree( line->name ); + xfree( vline ); } void Copy_AN1_Line( void **vdline, void *vline ) { @@ -318,8 +324,10 @@ void Copy_AN1_Line( void **vdline, void *vline ) { static an1_line_record *Alloc_AN1_Line( ) { an1_line_record *result = NULL; result = (an1_line_record *)xcalloc( sizeof(*result), 1 ); - result->base.copy = Copy_AN1_Line; - result->base.destroy = Destroy_AN1_Line; + result->fs.type = FS_AN1L; + result->fs.copy = Copy_AN1_Line; + result->fs.destroy = Destroy_AN1_Line; + return result; } @@ -451,7 +459,7 @@ static void Write_AN1_Line( FILE *f, an1_line_record *line ) { len = strlen( line->name ); WriteShort( f, len ); WriteString( f, line->name ); - WriteShort( f, line->lineweight ); + WriteShort( f, (short) line->lineweight ); WriteLong( f, line->linestyle ); WriteLong( f, line->linecolor ); WriteLong( f, line->unk5 ); @@ -507,7 +515,7 @@ static void Read_AN1_Header( FILE *f ) { static void Write_AN1_Header( FILE *f ) { WriteShort( f, 11557 ); - WriteShort( f, atoi( output_type ) ); + WriteShort( f, (short) atoi( output_type ) ); } static void Read_AN1_Bitmaps( FILE *f ) { @@ -547,7 +555,7 @@ static void Read_AN1_Waypoints( FILE *f ) { unsigned long count = 0; unsigned long i = 0; an1_waypoint_record *rec = NULL; - waypoint *wpt_tmp; + waypoint *wpt_tmp; char *icon = NULL; ReadShort( f ); count = ReadLong( f ); @@ -563,8 +571,8 @@ static void Read_AN1_Waypoints( FILE *f ) { if (FindIconByGuid(&rec->guid, &icon)) { wpt_tmp->icon_descr = icon; } - - wpt_tmp->an1_extras = (an1_base *)(void *)rec; + + fs_chain_add( &(wpt_tmp->fs), (format_specific_data *)rec); rec = NULL; waypt_add( wpt_tmp ); } @@ -575,9 +583,12 @@ Write_One_AN1_Waypoint( const waypoint *wpt ) { an1_waypoint_record *rec; int local; + format_specific_data *fs = NULL; + + fs = fs_chain_find( wpt->fs, FS_AN1W ); - if ( wpt->an1_extras ) { - rec = (an1_waypoint_record *)(void *)(wpt->an1_extras); + if ( fs ) { + rec = (an1_waypoint_record *)fs; xfree( rec->name ); local = 0; } @@ -604,7 +615,6 @@ Write_One_AN1_Waypoint( const waypoint *wpt ) Write_AN1_Waypoint( outfile, rec ); if ( local ) { Destroy_AN1_Waypoint( rec ); - xfree( rec ); } } @@ -630,9 +640,9 @@ static void Read_AN1_Lines( FILE *f ) { Read_AN1_Line( f, rec ); /* create route rec */ rte_head = route_head_alloc(); - rte_head->an1_extras = (an1_base *)(void *)rec; + fs_chain_add( &rte_head->fs, (format_specific_data *)rec ); route_add_head(rte_head); - for (j = 0; j < rec->pointcount; j++ ) { + for (j = 0; j < (unsigned) rec->pointcount; j++ ) { vert = Alloc_AN1_Vertex(); Read_AN1_Vertex( f, vert ); @@ -642,7 +652,8 @@ static void Read_AN1_Lines( FILE *f ) { wpt_tmp->longitude = -DecodeOrd( vert->lon ); wpt_tmp->shortname = (char *) xmalloc(7); sprintf( wpt_tmp->shortname, "\\%5.5x", rtserial++ ); - wpt_tmp->an1_extras = (an1_base *)(void *)vert; + fs_chain_add( &wpt_tmp->fs, + (format_specific_data *)vert ); route_add_wpt(rte_head, wpt_tmp); } } @@ -653,15 +664,18 @@ Write_One_AN1_Line( const route_head *rte ) { an1_line_record *rec; int local; + format_specific_data *fs = NULL; - if ( rte->an1_extras ) { - rec = (an1_line_record *)(void *)(rte->an1_extras); + fs = fs_chain_find( rte->fs, FS_AN1L ); + + if ( fs ) { + rec = (an1_line_record *)(void *)fs; local = 0; switch (output_type_num) { case 1: if ( rec->type != 14 ) { rec = Alloc_AN1_Line(); - memcpy( rec, rte->an1_extras, sizeof(an1_line_record)); + memcpy( rec, fs, sizeof(an1_line_record)); local = 1; rec->magic = 4112; rec->unk1 = 4359; @@ -673,7 +687,7 @@ Write_One_AN1_Line( const route_head *rte ) case 2: if ( rec->type != 15 ) { rec = Alloc_AN1_Line(); - memcpy( rec, rte->an1_extras, sizeof(an1_line_record)); + memcpy( rec, fs, sizeof(an1_line_record)); local = 1; rec->type = 15; } // end if @@ -681,7 +695,7 @@ Write_One_AN1_Line( const route_head *rte ) case 4: if ( rec->type != 16 ) { rec = Alloc_AN1_Line(); - memcpy( rec, rte->an1_extras, sizeof(an1_line_record)); + memcpy( rec, fs, sizeof(an1_line_record)); local = 1; rec->type = 16; } // end if @@ -740,7 +754,6 @@ Write_One_AN1_Line( const route_head *rte ) Write_AN1_Line( outfile, rec ); if ( local ) { Destroy_AN1_Line( rec ); - xfree( rec ); } } @@ -749,9 +762,12 @@ Write_One_AN1_Vertex( const waypoint *wpt ) { an1_vertex_record *rec; int local; + format_specific_data *fs = NULL; + + fs = fs_chain_find( wpt->fs, FS_AN1V ); - if ( wpt->an1_extras ) { - rec = (an1_vertex_record *)(void *)(wpt->an1_extras); + if ( fs ) { + rec = (an1_vertex_record *)(void *)fs; local = 0; } else { @@ -765,7 +781,6 @@ Write_One_AN1_Vertex( const waypoint *wpt ) Write_AN1_Vertex( outfile, rec ); if ( local ) { Destroy_AN1_Vertex( rec ); - xfree( rec ); } } diff --git a/bcr.c b/bcr.c new file mode 100644 index 000000000..29bde2fa7 --- /dev/null +++ b/bcr.c @@ -0,0 +1,504 @@ +/* + + Support for Motorrad Routenplaner (Map&Guide) .bcr files. + + Copyright (C) 2005 Olaf Klein, o.b.klein@t-online.de + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA +*/ + + +#include "defs.h" +#include "garmin_tables.h" +#include +#include +#include +#include + + +#define MYNAME "bcr" + +#define BCR_DEBUG +// #undef BCR_DEBUG + +#define SEC_UNKNOWN 0 +#define SEC_CLIENT 1 +#define SEC_ROUTE 2 +#define SEC_DESCR 3 +#define SEC_COORD 4 + +#define R_EARTH 6371000 /* radius of our big blue ball */ + +/* + 6371014 would be a better value when converting to f.e. to mapsoure, + but this seems to be used by Map&Guide when exporting to XML. +*/ + +static FILE *fin, *fout; +char *filename; +int curr_rte_num, target_rte_num; +static double radius; + +/* placeholders for options */ + +static char *rtenum_opt; +static char *rtename_opt; +static char *radius_opt; + +static +arglist_t bcr_args[] = { + {"index", &rtenum_opt, "Index of route to write (if more the one in source)", NULL, ARGTYPE_INT }, + {"name", &rtename_opt, "New name for the route", NULL, ARGTYPE_STRING }, + {"radius", &radius_opt, "Radius of our big earth (default 6371000 meters)", NULL, ARGTYPE_FLOAT }, + {0, 0, 0, 0, 0} +}; + +void +bcr_init_radius(void) +{ + if (radius_opt != NULL) /* preinitialize the earth radius */ + { + radius = atof(radius_opt); + if (radius < 0) + fatal(MYNAME ": Sorry, the radius should be greater than zero!\n"); + } + else + radius = (double)R_EARTH; + + if (global_opts.verbose_status > 0) + printf(MYNAME ": We calculate with radius %f meters.\n", radius); +} + +static void +bcr_rd_init(const char *fname) +{ + filename = xstrdup(fname); + fin = xfopen(fname, "r", MYNAME); + bcr_init_radius(); +} + +static void +bcr_rd_deinit(void) +{ + fclose(fin); + xfree(filename); +} + +/* ------------------------------------------------------------*/ + +char * +bcr_next_char(const char *buff) +{ + char *result = (char *)buff; + while (*result > '\0' && *result <= ' ') result++; /* trim leading spaces */ + return result; +} + +waypoint * +bcr_find_waypt(const char *name, route_head *route) /* find a waypt by name, create new */ +{ /* if not found */ + waypoint *wpt; + queue *elem, *tmp; + + QUEUE_FOR_EACH(&route->waypoint_list, elem, tmp) + { + wpt = (waypoint *) elem; + if (0 == strcmp(wpt->shortname, name)) + return wpt; + } + wpt = waypt_new(); + wpt->shortname = xstrdup(name); + + return wpt; +} + +void +bcr_create_waypts_from_route(route_head *route) +{ + waypoint *wpt; + queue *elem, *tmp; + + QUEUE_FOR_EACH(&route->waypoint_list, elem, tmp) + { + wpt = waypt_dupe((waypoint *) elem); + waypt_add(wpt); + } +} + +void +bcr_wgs84_to_mercator(const double lat, const double lon, int *north, int *east) +{ + double N, E; + + N = log(tan(lat * M_PI / 360 + M_PI / 4)) * radius; + E = lon * radius * M_PI / (double)180; + + if (lat > 0) N += 0.500000000001; /* we go from double to integer */ + else N -= 0.500000000001; /* it's time to round a little bit */ + if (lon > 0) E += 0.500000000001; + else E -= 0.500000000001; + + *north = N; + *east = E; +} + +void +bcr_mercator_to_wgs84(const int north, const int east, double *lat, double *lon) +{ + *lat = 2 * (atan(exp(north / radius)) - M_PI / 4) / M_PI * (double)180; + *lon = (double)east * (double)180 / (radius * M_PI); +} + +static int +bcr_sort_route_by_index_cb(const void *a, const void *b) +{ + const waypoint *wa = *(waypoint **)a; + const waypoint *wb = *(waypoint **)b; + return wa->centiseconds - wb->centiseconds; +} + +route_head * +bcr_sort_route_by_index(route_head *route) +{ + route_head *result; + queue *elem, *tmp; + waypoint **list; + waypoint *wpt; + int i; + int count = route->rte_waypt_ct; + + if (count == 0) return (route); /* nothing to do */ + + result = route_head_alloc(); + result->rte_name = xstrdup(route->rte_name); + route_add_head(result); + + list = (waypoint **) xcalloc(route->rte_waypt_ct, sizeof(*list)); + i = 0; + QUEUE_FOR_EACH((queue *)&route->waypoint_list, elem, tmp) + { + wpt = (waypoint *)elem; + list[i++] = wpt; + } + qsort(list, route->rte_waypt_ct, sizeof(*list), bcr_sort_route_by_index_cb); + for (i=0; icentiseconds = 0; /* reset our index container */ + route_add_wpt(result, waypt_dupe(wpt)); + route_del_wpt(route, wpt); + } + + xfree(list); + route_del_head(route); + + return result; +} + +/* ------------------------------------------------------------- */ + +static void +bcr_data_read(void) +{ + char buff[1024]; + char *src; + int section = SEC_UNKNOWN; + char *c, *cx, *ctemp; + int index; + int mlat, mlon; /* mercator data */ + double xalt; + int line, skip; + + route_head *route; + waypoint *wpt; + + route = route_head_alloc(); + route_add_head(route); + + line = skip = 0; + src = NULL; + + while (NULL != fgets(buff, sizeof(buff), fin)) + { + line++; + + c = buff; /* trim the end of the buffer */ + cx = c + strlen(c) - 1; + while ((cx > c) && (*cx <= ' ')) + { + *cx = '\0'; + cx--; + } + if (src != NULL) xfree(src); + + src = str_iso8859_1_to_utf8(buff); + /* !! buff is now free and can be used */ + + c = bcr_next_char(src); /* skip spaces */ + if (*c == '\0') continue; /* skip empty lines */ + + if (*c == '[') /* new section */ + { + skip = 0; + + c = bcr_next_char(++c); + cx = strchr(c, ']'); + if (cx == NULL) fatal(MYNAME ": error in file structure (\"]\" expected)!\n"); + + *cx = '\0'; + if (strcmp(c, "CLIENT") == 0) section = SEC_CLIENT; + else if (strcmp(c, "ROUTE") == 0) section = SEC_ROUTE; + else if (strcmp(c, "DESCRIPTION") == 0) section = SEC_DESCR; + else if (strcmp(c, "COORDINATES") == 0) section = SEC_COORD; + else + { + printf(MYNAME ": unknown section \"%s\".\n", c); + skip = 1; + } + continue; + } + + if (skip != 0) continue; + + cx = strchr(c, '='); + if (cx == NULL) continue; + + *cx++ = '\0'; /* delimit in key and data */ + + if ((section == SEC_CLIENT) && (strcmp(c, "ROUTENAME") == 0)) + { + route->rte_name = xstrdup(cx); + } + else + { + if (strncmp(c, "STATION", 7) != 0) continue; + index = atoi(c+7); + + /* bcr_find_waypt(... creates new waypoint, if not in queue */ + + switch(section) + { + case SEC_CLIENT: + wpt = bcr_find_waypt(c, route); + wpt->centiseconds = index; + ctemp = strchr(cx, ','); + if (ctemp != NULL) *ctemp = ' '; + if (2 != sscanf(cx, "%s %lf", buff, &xalt)) + fatal(MYNAME ": structure error on line %d!\n(data: %s=%s)\n", line, c, cx); +#if 0 + if (xalt != 999999999) + wpt->altitude = xalt / 3.2808; /* convert feet to meters */ +#endif + route_add_wpt(route, wpt); + + if (case_ignore_strcmp(buff, "standort") == 0) + wpt->icon_descr = mps_find_desc_from_icon_number(18, MAPSOURCE); + else if (case_ignore_strcmp(buff, "Town") == 0) + wpt->icon_descr = mps_find_desc_from_icon_number(69, MAPSOURCE); + else + printf(MYNAME ": Unknown icon \"%s\" found. Please report.\n", buff); + break; + + case SEC_DESCR: + wpt = bcr_find_waypt(c, route); + wpt->centiseconds = index; + + ctemp = strchr(cx, '@'); + if (ctemp != NULL) + { + *ctemp-- = '\0'; + if (*ctemp == ',') *ctemp = '\0'; + } + wpt->description = xstrdup(cx); + break; + + case SEC_COORD: + wpt = bcr_find_waypt(c, route); + wpt->centiseconds = index; + if (2 != sscanf(cx, "%d,%d", &mlon, &mlat)) + fatal(MYNAME ": structure error on line %d!\n", line); + + bcr_mercator_to_wgs84(mlat, mlon, &wpt->latitude, &wpt->longitude); + case SEC_ROUTE: + break; + } + } + } + if (src != NULL) xfree(src); + src = NULL; + + route = bcr_sort_route_by_index(route); + bcr_create_waypts_from_route(route); +} + +/* %%% bcr write support %%% ----------------------------------- */ + +static void +bcr_wr_init(const char *fname) +{ + filename = xstrdup(fname); + fout = xfopen(fname, "w", MYNAME); + bcr_init_radius(); +} + +static void +bcr_wr_deinit(void) +{ + fclose(fout); + xfree(filename); +} + +static void +bcr_route_trailer(const route_head *rte) +{ +} + +static void +bcr_write_wpt(const waypoint *wpt) +{ +} + +void bcr_write_line(FILE *fout, const char *key, int *index, const char *value) +{ + if (value == NULL) /* this is mostly used in the world of windows */ + { /* so we respectfully add a CR/LF on each line */ + fprintf(fout, "%s\x0d\n", key); + } + else + { + if (index != NULL) + fprintf(fout, "%s%d=%s\x0d\n", key, *index, value); + else + fprintf(fout, "%s=%s\x0d\n", key, value); + } +} + +static void +bcr_route_header(const route_head *route) +{ + queue *elem, *tmp; + waypoint *wpt; + char *c; + int i, icon, north, east, nmin, nmax, emin, emax; + char buff[128], symbol[32]; + + curr_rte_num++; + if (curr_rte_num != target_rte_num) return; + + bcr_write_line(fout, "[CLIENT]", NULL, NULL); /* client section */ + + bcr_write_line(fout, "REQUEST", NULL, "TRUE"); + + c = route->rte_name; + if (rtename_opt != 0) c = rtename_opt; + if (c != NULL) + bcr_write_line(fout, "ROUTENAME", NULL, c); + else + bcr_write_line(fout, "ROUTENAME", NULL, "Route"); + + bcr_write_line(fout, "DESCRIPTIONLINES", NULL, "1"); + bcr_write_line(fout, "DESCRIPTION1", NULL, ""); + + i = 0; + QUEUE_FOR_EACH(&route->waypoint_list, elem, tmp) + { + i++; + wpt = (waypoint *) elem; + + strncpy(symbol, "Standort", sizeof(symbol)); + if (wpt->icon_descr != 0) + { + icon = mps_find_icon_number_from_desc(wpt->icon_descr, MAPSOURCE); + if ((icon >= 69) && (icon <= 72)) + strncpy(symbol, "Town", sizeof(symbol)); + } + snprintf(buff, sizeof(buff), "%s,%s", symbol, "999999999"); + bcr_write_line(fout, "STATION", &i, buff); + } + + bcr_write_line(fout, "[COORDINATES]", NULL, NULL); /* coords section */ + + nmin = emin = (1<<30); + emax = nmax = -nmin; + + i = 0; + QUEUE_FOR_EACH(&route->waypoint_list, elem, tmp) + { + i++; + wpt = (waypoint *) elem; + + bcr_wgs84_to_mercator(wpt->latitude, wpt->longitude, &north, &east); + + if (north > nmax) nmax = north; + if (east > emax) emax = east; + if (north < nmin) nmin = north; + if (east < emin) emin = east; + + snprintf(buff, sizeof(buff), "%d,%d", east, north); + bcr_write_line(fout, "STATION", &i, buff); + } + + bcr_write_line(fout, "[DESCRIPTION]", NULL, NULL); /* descr. section */ + + i = 0; + QUEUE_FOR_EACH(&route->waypoint_list, elem, tmp) + { + i++; + wpt = (waypoint *) elem; + c = wpt->description; + if (c == NULL) c = wpt->shortname; + bcr_write_line(fout, "STATION", &i, c); + } + + bcr_write_line(fout, "[ROUTE]", NULL, NULL); /* route section */ + + snprintf(buff, sizeof(buff), "%d,%d,%d,%d", emin, nmax, emax, nmin); + bcr_write_line(fout, "ROUTERECT", NULL, buff); + +} + +static void +bcr_data_write(void) +{ + + if (global_opts.objective == rtedata) + { + target_rte_num = 1; + + if (rtenum_opt != NULL) + { + target_rte_num = atoi(rtenum_opt); + if (((unsigned)target_rte_num > route_count()) || (target_rte_num < 1)) + fatal(MYNAME ": invalid route number %d (1..%d))!\n", + target_rte_num, route_count()); + } + curr_rte_num = 0; + route_disp_all(bcr_route_header, bcr_route_trailer, bcr_write_wpt); + } +} + +ff_vecs_t bcr_vecs = { + ff_type_file, + { ff_cap_none, ff_cap_none, ff_cap_read | ff_cap_write}, + bcr_rd_init, + bcr_wr_init, + bcr_rd_deinit, + bcr_wr_deinit, + bcr_data_read, + bcr_data_write, + NULL, + bcr_args +}; + diff --git a/cetus.c b/cetus.c index 6b09650d0..ba44ed1f8 100644 --- a/cetus.c +++ b/cetus.c @@ -19,13 +19,25 @@ */ +/* + + History: + + 2005/08/03: Added track_read by O.K. + (Thanx to Adam Schneider for additional information) + +*/ + #include "defs.h" #include "coldsync/palm.h" #include "coldsync/pdb.h" - +# #define MYNAME "Cetus" -#define MYTYPE 0x43577074 /* CWpt */ -#define MYCREATOR 0x63475053 /* cGPS */ +#define MYTYPE_WPT 0x43577074 /* CWpt */ +#define MYTYPE_TRK 0x7374726d /* strm */ + +#define MYCREATOR 0x63475053 /* cGPS */ +#define MYTRACK 0x44424c4b /* DBLK */ #define NOTESZ 4096 #define DESCSZ 4096 @@ -43,7 +55,7 @@ typedef enum { /* the icon field contains the garmin symbol number */ } wpt_type; -struct record { +struct cetus_wpt_s { char type; char readonly; @@ -88,6 +100,42 @@ struct record { pdb_16 category; }; +typedef struct cetus_track_head_s +{ + char id[2]; + char version; + unsigned char interval; + unsigned short gps; + char year; + char month; + char day; + char hour; + char min; + char sec; + char dsec; + char tz; + char desc; +} cetus_track_head_t; + +#define TRACK_HEAD_SIZE sizeof(struct cetus_track_head_s) + +typedef struct cetus_track_point_s +{ + char hour; + char min; + char sec; + char msec; + char sat; + char hdop; + pdb_32 latitude; + pdb_32 longitude; + short speed; + short course; + pdb_32 elevation; +} cetus_track_point_t; + +#define TRACK_POINT_SIZE sizeof(struct cetus_track_point_s) + static FILE *file_in; static FILE *file_out; static const char *out_fname; @@ -106,68 +154,158 @@ arglist_t cetus_args[] = { {0, 0, 0, 0 } }; -static void -rd_init(const char *fname) +static waypoint * +read_track_point(cetus_track_point_t *data, const time_t basetime) { - file_in = xfopen(fname, "rb", MYNAME); -} + int i, ilat, ilon; + waypoint *wpt; -static void -rd_deinit(void) -{ - fclose(file_in); - if ( dbname ) { - xfree(dbname); - dbname = NULL; + ilat = be_read32(&data->latitude); + ilon = be_read32(&data->longitude); + + if (data->hour == -1 || data->min == -1 || data->sec == -1 || + ilat == 2000000000 || ilon == 2000000000) return NULL; /* At least one of basic data is not available */ + + wpt = waypt_new(); + + wpt->latitude = (double)ilat / 10000000.0; + wpt->longitude = (double)ilon / 10000000.0; + + i = be_read32(&data->elevation); + wpt->altitude = (i == -100000000) ? unknown_alt : (double) i / 100.0; + + if (data->sat != -1) wpt->sat = data->sat; + if (data->hdop != -1) wpt->hdop = (float) data->hdop / 10; + + i = be_read16(&data->speed); + if (i != 10000) wpt->speed = ((float) i / 10) * 0.514444; /* meters/second */ + i = be_read16(&data->course); + if (i != 4000) wpt->course = (float) i / 10; + + switch(data->hour / 32) /* extract fix */ + { + case 0: break; /* no GPS */ + case 1: wpt->fix = fix_none; break; + case 2: wpt->fix = fix_2d; break; + case 3: wpt->fix = fix_3d; break; + case 4: wpt->fix = fix_dgps; break; } -} + + wpt->creation_time = basetime + + ((data->hour % 32) * 3600) + (data->min * 60) + data->sec; -static void -wr_init(const char *fname) -{ - file_out = xfopen(fname, "wb", MYNAME); - out_fname = fname; + return wpt; } + static void -wr_deinit(void) +read_tracks(const struct pdb *pdb) { - fclose(file_out); - if ( dbname ) { - xfree(dbname); - dbname = NULL; + struct pdb_record *pdb_rec; + int reclen, records, total, points, dropped; + char descr[(2 * TRACK_POINT_SIZE) + 1]; + char temp_descr[TRACK_POINT_SIZE + 1]; + cetus_track_head_t *head; + waypoint *wpt, *prev; + route_head *track; + time_t basetime; + + track = route_head_alloc(); + track_add_head(track); + + total = 0; + points = 0; + dropped = 0; + basetime = 0; + + for (pdb_rec = pdb->rec_index.rec; pdb_rec != NULL; pdb_rec = pdb_rec->next) + { + int i, magic; + char *c = (char *)pdb_rec->data; + + magic = be_read32(c); + if (magic != MYTRACK) + fatal(MYNAME ": Invaid track data or unsupported version!\n"); + + reclen = be_read32(c+4); + records = reclen / TRACK_POINT_SIZE; + + c += 8; + prev = NULL; + + for (i = 0; i < records; i++, c += TRACK_POINT_SIZE) + { + switch(total++) + { + struct tm tm; + + case 0: /* track header */ + head = (cetus_track_head_t *)c; + if (head->id[0] != 'C' || head->id[1] != 'G') fatal(MYNAME ": Invalid track header!\n"); + + memset(&tm, 0, sizeof(tm)); + tm.tm_mday = head->day; + tm.tm_mon = head->month - 1; + tm.tm_year = head->year + 100; + basetime = mktime(&tm); + break; + + case 1: /* first part of description */ + strncpy(descr, c, TRACK_POINT_SIZE); + break; + + case 2: /* continued description */ + strncpy(temp_descr, c, TRACK_POINT_SIZE); + strcat(descr, temp_descr); /* here is no need to check target size */ + if (strlen(descr) > 0) + track->rte_desc = xstrdup(descr); + break; + + default: + wpt = read_track_point((cetus_track_point_t *)c, basetime); + if (wpt != NULL) + { + route_add_wpt(track, wpt); + points++; + + /* Did we run over midnight ? */ + if ((prev != NULL) && (prev->creation_time > wpt->creation_time)) + { + basetime += (24 * 3600); + wpt->creation_time += (24 * 3600); + } + prev = wpt; + } + else + dropped++; + } + + } + } + + if (global_opts.verbose_status > 0) + { + printf(MYNAME ": Loaded %d track point(s) from source.\n", points); + if (dropped > 0) + printf(MYNAME ": ! %d dropped because of missing data (no time, no coordinates) !\n", dropped); } } static void -data_read(void) +read_waypts(const struct pdb *pdb) { - struct record *rec; - struct pdb *pdb; + struct cetus_wpt_s *rec; struct pdb_record *pdb_rec; char *vdata; - if (NULL == (pdb = pdb_Read(fileno(file_in)))) { - fatal(MYNAME ": pdb_Read failed\n"); - } - - if ((pdb->creator != MYCREATOR) || (pdb->type != MYTYPE)) { - fatal(MYNAME ": Not a Cetus file.\n"); - } - - if (pdb->version < 1) { - fatal(MYNAME ": This file is from an obsolete beta version of Cetus GPS and is unsupported.\n"); - } - if (pdb->version > 1) { - fatal(MYNAME ": This file is from an unsupported newer version of Cetus GPS. It may be supported in a newer version of GPSBabel.\n"); - } - - for(pdb_rec = pdb->rec_index.rec; pdb_rec; pdb_rec=pdb_rec->next) { + for(pdb_rec = pdb->rec_index.rec; pdb_rec; pdb_rec=pdb_rec->next) + { waypoint *wpt_tmp; + int i; wpt_tmp = waypt_new(); - rec = (struct record *) pdb_rec->data; + rec = (struct cetus_wpt_s *) pdb_rec->data; if ( be_read32(&rec->elevation) == -100000000 ) { wpt_tmp->altitude = unknown_alt; } @@ -175,13 +313,30 @@ data_read(void) wpt_tmp->altitude = be_read32(&rec->elevation) / 100.0; } - wpt_tmp->longitude = be_read32(&rec->longitude) / 10000000.0; wpt_tmp->latitude = be_read32(&rec->latitude) / 10000000.0; + wpt_tmp->longitude = be_read32(&rec->longitude) / 10000000.0; + + if (rec->sat != 0xff) + wpt_tmp->sat = rec->sat; + + i = be_read16(&rec->pdop); + if (i != 0xffff) wpt_tmp->pdop = i / 100.0; + i = be_read16(&rec->hdop); + if (i != 0xffff) wpt_tmp->hdop = i / 100.0; + i = be_read16(&rec->vdop); + if (i != 0xffff) wpt_tmp->vdop = i / 100.0; + + switch (rec->type) { + case WptGPS2D: wpt_tmp->fix = fix_2d; break; + case WptGPS3D: wpt_tmp->fix = fix_3d; break; + case WptDGPS2D: wpt_tmp->fix = fix_dgps; break; + case WptDGPS3D: wpt_tmp->fix = fix_dgps; break; + } if (be_read16(&rec->year) != 0xff) { struct tm tm; - memset (&tm, sizeof(tm), 0); + memset (&tm, 0, sizeof(tm)); tm.tm_min = rec->min; tm.tm_hour = rec->hour; tm.tm_mday = rec->day; @@ -205,6 +360,64 @@ data_read(void) waypt_add(wpt_tmp); } +} + +/* --------------------------------------------------------------------------- */ + +static void +rd_init(const char *fname) +{ + file_in = xfopen(fname, "rb", MYNAME); +} + +static void +rd_deinit(void) +{ + fclose(file_in); + if ( dbname ) { + xfree(dbname); + dbname = NULL; + } +} + +static void +wr_init(const char *fname) +{ + file_out = xfopen(fname, "wb", MYNAME); + out_fname = fname; +} + +static void +wr_deinit(void) +{ + fclose(file_out); + if ( dbname ) { + xfree(dbname); + dbname = NULL; + } +} + +static void +data_read(void) +{ + struct pdb *pdb; + + if (NULL == (pdb = pdb_Read(fileno(file_in)))) { + fatal(MYNAME ": pdb_Read failed\n"); + } + + if (pdb->creator != MYCREATOR) fatal(MYNAME ": Not a Cetus file.\n"); + + switch(pdb->type) + { + case MYTYPE_TRK: + read_tracks(pdb); + break; + + case MYTYPE_WPT: + read_waypts(pdb); + break; + } free_pdb(pdb); } @@ -212,7 +425,7 @@ data_read(void) static void cetus_writewpt(const waypoint *wpt) { - struct record *rec; + struct cetus_wpt_s *rec; static int ct; struct tm *tm; char *vdata; @@ -247,9 +460,9 @@ cetus_writewpt(const waypoint *wpt) be_write32(&rec->elevation, (unsigned int) (wpt->altitude * 100.0)); } - be_write16( &rec->pdop, 0xffff ); - be_write16( &rec->hdop, 0xffff ); - be_write16( &rec->vdop, 0xffff ); + be_write16( &rec->pdop, wpt->pdop ? wpt->pdop * 100 : 0xffff ); + be_write16( &rec->hdop, wpt->hdop ? wpt->hdop * 100 : 0xffff ); + be_write16( &rec->vdop, wpt->vdop ? wpt->vdop * 100 : 0xffff ); be_write16( &rec->dgpstime, 0xffff ); be_write32( &rec->distance, 0xffffffff ); @@ -260,7 +473,7 @@ cetus_writewpt(const waypoint *wpt) rec->vmon = 0xff; be_write16(&rec->vyear, 0xff); - rec->sat = 0xff; + rec->sat = wpt->sat ? wpt->sat : 0xff; vdata = (char *)rec + sizeof(*rec); if ( wpt->shortname ) { @@ -379,7 +592,7 @@ data_write(void) opdb->name[PDB_DBNAMELEN-1] = 0; opdb->attributes = PDB_ATTR_BACKUP; opdb->ctime = opdb->mtime = current_time() + 2082844800U; - opdb->type = MYTYPE; /* CWpt */ + opdb->type = MYTYPE_WPT; /* CWpt */ opdb->creator = MYCREATOR; /* cGPS */ opdb->version = 1; @@ -416,7 +629,7 @@ data_write(void) ff_vecs_t cetus_vecs = { ff_type_file, - FF_CAP_RW_WPT, + { ff_cap_write | ff_cap_read, ff_cap_read, ff_cap_none }, rd_init, wr_init, rd_deinit, diff --git a/chkdoc b/chkdoc index 19f93ed13..f95844f6b 100644 --- a/chkdoc +++ b/chkdoc @@ -4,7 +4,7 @@ checkit() { export ECODE TYPE=$1 STY=$2 - if ! grep -q $TYPE ~/src/babelweb/capabilities.html + if ! grep -q $TYPE ~/src/babelweb/capabilities.html ~/src/babelweb/capabilities.inc then echo $STY $TYPE is not documented in capabilities.html. ECODE=1 diff --git a/coastexp.c b/coastexp.c index faef555f5..81b2a19eb 100644 --- a/coastexp.c +++ b/coastexp.c @@ -268,7 +268,7 @@ ce_cdata(void *dta, const XML_Char *s, int len) strncpy(secString, currentMark->created+13, 2); secString[2] = '\0'; t.tm_sec = atoi(secString); - currentMark->wp->creation_time = mktime(&t) + get_tz_offset(); + currentMark->wp->creation_time = mkgmtime(&t); } } else if (inRoute) { diff --git a/coto.c b/coto.c new file mode 100644 index 000000000..07c835e31 --- /dev/null +++ b/coto.c @@ -0,0 +1,415 @@ +/* + Read and write Coto files. + + Copyright (C) 2005 Tobias Minich, robertlipe@usa.net + + Based on the Cetus I/O Filter, + Copyright (C) 2002 Robert Lipe, robertlipe@usa.net + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#include "defs.h" +#include "csv_util.h" +#include "coldsync/palm.h" +#include "coldsync/pdb.h" + +#define MYNAME "cotoGPS" +#define MYTYPETRACK 0x5452434b /* TRCK */ +#define MYTYPEWPT 0x44415441 /* DATA */ +#define MYCREATOR 0x636f4750 /* coGP */ + +#define NOTESZ 4096 +#define DESCSZ 4096 + +typedef enum { + cotofixNone = 0, /* No Fix or Warning */ + cotofixReserved = 1, /* Shouldn't occur*/ + cotofix2D = 2, /* retrieved from a GPS with a 2D fix */ + cotofix3D = 3, /* retrieved from a GPS with a 3D fix */ + cotofixDGPS = 4, /* retrieved from a GPS with a DGPS signal */ +} fix_quality; + +struct record_track { + + pdb_double latitude; /* radians, s=negative */ + pdb_double longitude; /* same as lat; e=negative */ + pdb_double distance; /* Distance to thel last point; discarded since it's calculated by gpsbabel on write */ + pdb_double arc; /* Course, unknown dimension */ + pdb_double x,y; /* Internal virtual coordinates used for drawing the track on the Palm */ + + word alt; /* Altitude */ + + /* accuracy and precision information for use where applicable */ + uword hdop; /* _dop * 10 */ + uword vdop; + uword pdop; + ubyte sat_tracked; + ubyte fix_quality; + + uword speed; /* *10 */ + udword time; /* Palm Time */ +}; + +#define MAX_MARKER_NAME_LENGTH 20 +struct record_wpt { + char lon[8]; + char lat[8]; + char name[MAX_MARKER_NAME_LENGTH]; +}; + + +// We need the pdb AppInfo for waypoint categories + +typedef char appinfo_category[16]; + +#define APPINFO_PACKED_SIZE sizeof(uword)+16*sizeof(appinfo_category)+17*sizeof(ubyte) +struct appinfo { + uword renamedCategories; + appinfo_category categories[16]; + ubyte ids[16]; + ubyte maxid; +}; + +static FILE *file_in; +static FILE *file_out; +static const char *out_fname; +static const char *in_fname; /* We might need that for naming tracks */ +struct pdb *opdb; + +static char *trackname = NULL; +static char *zerocat = NULL; +static char *internals = NULL; + +static +arglist_t coto_args[] = { + {"trackname", &trackname, "Track name", NULL, ARGTYPE_STRING }, + {"zerocat", &zerocat, "Name of the 'unassigned' category.", NULL, ARGTYPE_STRING }, + {"internals", &internals, "Export some internal stuff to notes.", NULL, ARGTYPE_STRING|ARGTYPE_HIDDEN }, + {0, 0, 0, 0, 0 } +}; + +static void +rd_init(const char *fname) +{ + file_in = xfopen(fname, "rb", MYNAME); + in_fname = fname; +} + +static void +rd_deinit(void) +{ + fclose(file_in); + if ( trackname ) { + xfree(trackname); + trackname = NULL; + } +} + +static void +wr_init(const char *fname) +{ + file_out = xfopen(fname, "wb", MYNAME); + out_fname = fname; +} + +static void +wr_deinit(void) +{ + fclose(file_out); + if ( trackname ) { + xfree(trackname); + trackname = NULL; + } +} + +static void +coto_track_read(struct pdb *pdb) +{ + struct record_track *rec; + struct pdb_record *pdb_rec; + route_head *trk_head; + char *loctrackname = NULL; + + if (trackname) + // Given by user + loctrackname = xstrdup(trackname); + else if (strncmp(pdb->name, "cotoGPS TrackDB", PDB_DBNAMELEN)) + // Use database name if not default + loctrackname = xstrndup(pdb->name, PDB_DBNAMELEN); + else { + // Use filename + const char *fnametmp = strrchr(in_fname, '/'); // FIXME: Don't know if this works on Windows + if (fnametmp) + fnametmp++; + else + fnametmp = in_fname; + loctrackname = xstrndup(fnametmp, strrchr(fnametmp,'.')-fnametmp); + } + + trk_head = route_head_alloc(); + track_add_head(trk_head); + + trk_head->rte_name = loctrackname; + + for(pdb_rec = pdb->rec_index.rec; pdb_rec; pdb_rec=pdb_rec->next) { + waypoint *wpt_tmp; + + wpt_tmp = waypt_new(); + + rec = (struct record_track *) pdb_rec->data; + + wpt_tmp->longitude = -pdb_read_double(&rec->longitude)*360.0/(2.0*M_PI); + wpt_tmp->latitude = pdb_read_double(&rec->latitude)*360.0/(2.0*M_PI); + // It's not the course, so leave it out for now + // wpt_tmp->course = pdb_read_double(&rec->arc); + wpt_tmp->altitude = be_read16(&rec->alt); + + if (internals) { + // Parse the option as xcsv delimiter + const char *inter = xcsv_get_char_from_constant_table(internals); + char temp[256]; + snprintf(temp, sizeof(temp), "%.20f%s%.20f%s%.20f%s%.20f", pdb_read_double(&rec->distance), inter, + pdb_read_double(&rec->arc), inter, pdb_read_double(&rec->x), inter, pdb_read_double(&rec->y)); + wpt_tmp->notes = xstrdup(temp); + } + + wpt_tmp->pdop = be_read16(&rec->pdop)/10.0; + wpt_tmp->hdop = be_read16(&rec->hdop)/10.0; + wpt_tmp->vdop = be_read16(&rec->vdop)/10.0; + wpt_tmp->sat = rec->sat_tracked; + switch (rec->fix_quality) { + case cotofixNone: wpt_tmp->fix = fix_none; break; + case cotofixReserved: wpt_tmp->fix = fix_unknown; break; + case cotofix2D: wpt_tmp->fix = fix_2d; break; + case cotofix3D: wpt_tmp->fix = fix_3d; break; + case cotofixDGPS: wpt_tmp->fix = fix_dgps; break; + } + wpt_tmp->speed = be_read16(&rec->speed)/10.0; + wpt_tmp->creation_time = be_read32(&rec->time) - 2082844800U; + + route_add_wpt(trk_head, wpt_tmp); + + } + +} + +static void +coto_wpt_read(struct pdb *pdb) +{ + struct record_wpt *rec; + struct pdb_record *pdb_rec; + char *vdata; + struct appinfo *app; + + app = (struct appinfo *) pdb->appinfo; + + for(pdb_rec = pdb->rec_index.rec; pdb_rec; pdb_rec=pdb_rec->next) { + waypoint *wpt_tmp; + int c=-1; + + wpt_tmp = waypt_new(); + + rec = (struct record_wpt *) pdb_rec->data; + + // Find category + /* I thought this would be the proper way. Leaving it in in case it becomes the proper one =) + for(i=0;i<16;i++) + if (app->ids[i] == pdb_rec->category) {c=i; break;} + */ + c = pdb_rec->category; + + wpt_tmp->longitude = -pdb_read_double(&rec->lon)*360.0/(2.0*M_PI); + wpt_tmp->latitude = pdb_read_double(&rec->lat)*360.0/(2.0*M_PI); + + wpt_tmp->shortname = xstrdup((char *) &rec->name); + wpt_tmp->description = xstrdup((char *) &rec->name); + + if (c>0) + wpt_tmp->icon_descr = xstrndup(app->categories[c], 16); + else if (c<0) + wpt_tmp->icon_descr = xstrdup("Unknown"); + if (wpt_tmp->icon_descr) + wpt_tmp->wpt_flags.icon_descr_is_dynamic = 1; + + if (pdb_rec->data_len>sizeof(*rec)) { + vdata = (char *) pdb_rec->data + sizeof(*rec); + wpt_tmp->notes = xstrdup(vdata); + } + + waypt_add(wpt_tmp); + } +} + +static void +data_read(void) +{ + struct pdb *pdb; + + if (NULL == (pdb = pdb_Read(fileno(file_in)))) { + fatal(MYNAME ": pdb_Read failed\n"); + } + + if ((pdb->creator != MYCREATOR) || ((pdb->type != MYTYPETRACK) && (pdb->type != MYTYPEWPT))) { + warning("Creator %x Type %x Version %d\n", (int) pdb->creator, (int) pdb->type, (int) pdb->version); + fatal(MYNAME ": Not a cotoGPS file.\n"); + } + + if (pdb->version > 0) { + fatal(MYNAME ": This file is from an unsupported newer version of cotoGPS. It may be supported in a newer version of GPSBabel.\n"); + } + + if (pdb->type == MYTYPETRACK) + coto_track_read(pdb); + if (pdb->type == MYTYPEWPT) + coto_wpt_read(pdb); + + free_pdb(pdb); +} + +static void +coto_prepare_wpt_write(struct pdb *opdb) +{ + struct appinfo *ai; + opdb->name[PDB_DBNAMELEN-1] = 0; + opdb->attributes = PDB_ATTR_BACKUP; + opdb->type = MYTYPEWPT; + opdb->creator = MYCREATOR; + opdb->version = 0; + + strncpy(opdb->name, "cotoGPS MarkerDB", PDB_DBNAMELEN); + + opdb->appinfo_len = APPINFO_PACKED_SIZE; + opdb->appinfo = calloc(APPINFO_PACKED_SIZE,1); + + ai = (struct appinfo *) opdb->appinfo; + be_write16(&ai->renamedCategories, 31); // Don't ask me why... + if (zerocat) + strncpy(ai->categories[0], zerocat, 16); + else + strncpy(ai->categories[0], "Not Assigned", 16); // FIXME: Replace by default English Palm 'Not Assigned' category + +} + +static void +coto_wpt_write(const waypoint *wpt) +{ + struct record_wpt *rec; + struct appinfo *ai = (struct appinfo *) opdb->appinfo; + static int ct; + struct pdb_record *opdb_rec; + static void *mkshort_wr_handle; + char *notes = NULL; + char *shortname = NULL; + char *vdata; + int size = sizeof(*rec); + ubyte cat = 0; + int i; + + mkshort_wr_handle = mkshort_new_handle(); + setshort_length(mkshort_wr_handle, MAX_MARKER_NAME_LENGTH); + setshort_whitespace_ok(mkshort_wr_handle, 1); + + if ((global_opts.synthesize_shortnames && wpt->description) || (!wpt->shortname)) + shortname = mkshort_from_wpt(mkshort_wr_handle, wpt); + else + shortname = xstrdup(wpt->shortname); + + if ((wpt->description) && ((strlen(wpt->description) > MAX_MARKER_NAME_LENGTH) || (strcmp(wpt->description, wpt->shortname)))) { + if ((wpt->notes) && (strcmp(wpt->description, wpt->notes))) { + size+=strlen(wpt->description)+strlen(wpt->notes)+9; + notes = xcalloc(strlen(wpt->description)+strlen(wpt->notes)+9,1); + sprintf(notes,"%s\nNotes:\n%s", wpt->description, wpt->notes); + } else { + size+=strlen(wpt->description)+1; + notes = xstrdup(wpt->description); + } + } else if (wpt->notes) { + size+=strlen(wpt->notes)+1; + notes = xstrdup(wpt->notes); + } + rec = xcalloc(size,1); + pdb_write_double(&rec->lon, -2.0*M_PI*wpt->longitude/360.0); + pdb_write_double(&rec->lat, 2.0*M_PI*wpt->latitude/360.0); + snprintf((char *) &rec->name, MAX_MARKER_NAME_LENGTH, "%s", shortname); + + if (notes) { + vdata = (char *) rec + sizeof(*rec); + strcpy(vdata, notes); + xfree(notes); + } + + if (wpt->icon_descr) { + for(i=1;i<16;i++) + if (!strncmp(wpt->icon_descr, ai->categories[i], 16)) {cat=i; break;} + if (!cat) { + // We have a new one + if (ai->maxid<15) { + i = ++ai->maxid; + snprintf(ai->categories[i], 16, "%s", wpt->icon_descr); + cat=ai->ids[i]=i; + } else { + // We're full! + warning(MYNAME ": Categories full. Category '%s' written as %s.\n", wpt->icon_descr, zerocat?zerocat:"Not Assigned"); + } + } + } + + opdb_rec = new_Record (0, cat, ct++, size, (const ubyte *)rec); + + if (opdb_rec == NULL) { + fatal(MYNAME ": libpdb couldn't create record\n"); + } + + if (pdb_AppendRecord(opdb, opdb_rec)) { + fatal(MYNAME ": libpdb couldn't append record\n"); + } + xfree(shortname); + xfree(rec); + + mkshort_del_handle(mkshort_wr_handle); + +} + +static void +data_write(void) +{ + if (NULL == (opdb = new_pdb())) { + fatal (MYNAME ": new_pdb failed\n"); + } + + coto_prepare_wpt_write(opdb); + waypt_disp_all(coto_wpt_write); + track_disp_all(NULL, NULL, coto_wpt_write); + route_disp_all(NULL, NULL, coto_wpt_write); + + pdb_Write(opdb, fileno(file_out)); + +} + + +ff_vecs_t coto_vecs = { + ff_type_file, + {ff_cap_read|ff_cap_write, ff_cap_read, ff_cap_none}, + rd_init, + wr_init, + rd_deinit, + wr_deinit, + data_read, + data_write, + NULL, + coto_args, +}; diff --git a/csv_util.c b/csv_util.c index e2423a5b1..263d4f95c 100644 --- a/csv_util.c +++ b/csv_util.c @@ -24,6 +24,7 @@ #include "defs.h" #include "csv_util.h" #include "grtcirc.h" +#include "strptime.h" #define MYNAME "CSV_UTIL" @@ -41,9 +42,8 @@ extern char *xcsv_urlbase; extern char *prefer_shortnames; extern const char *gs_get_container(geocache_container t); -extern geocache_container gs_mktype(const char *t); +extern geocache_type gs_mktype(const char *t); extern geocache_container gs_mkcont(const char *t); -extern const char *gs_get_cachetype(geocache_type t); static double pathdist = 0; static double oldlon = 999; @@ -186,6 +186,17 @@ csv_lineparse(const char *stringstart, const char *delimited_by, if (strcmp(delimited_by, "\\w") == 0) hyper_whitespace_delimiter = 1; + /* + * This is tacky. Our "csv" format is actually "commaspace" format. + * Changing that causes unwanted churn, but it also makes "real" + * comma separated data (such as likely to be produced by Excel, etc.) + * unreadable. So we silently change it here on a read and let the + * whitespace eater consume the space. + */ + if (strcmp(delimited_by, ", ") == 0) { + delimited_by = ","; + } + if (!p) { /* first pass thru */ p = stringstart; @@ -621,6 +632,92 @@ yyyymmdd_to_time(const char *s) return mktime(&tm); } + + +/* + * sscanftime - Parse a date buffer using strftime format + */ +static +time_t +sscanftime( const char *s, const char *format, const int gmt ) +{ + struct tm stm = {0,0,0,0,0,0,0,0,0}; + if ( strptime( s, format, &stm ) ) + { + stm.tm_isdst = -1; + if (gmt) + return mkgmtime(&stm); + else + return mktime(&stm); + } + + return -1; +} +static +time_t +addhms( const char *s, const char *format ) +{ + time_t tt =0; + int hour =0; + int min =0; + int sec =0; + char * ampm = NULL; + + ampm = xmalloc( strlen(s) ); + if (sscanf(s, format, &hour, &min, &sec, ampm)) + tt = ((tolower(ampm[0])=='P')?43200:0)+3600*hour+60*min+sec; + xfree(ampm); + + return tt; +} + +static +int +writetime(char * buff, size_t bufsize, const char * format, time_t t, int gmt ) +{ + static struct tm * stmp; + + if (gmt) + stmp = gmtime(&t); + else + stmp = localtime(&t); + + return strftime(buff, bufsize, format, stmp ); +} + +static +int +writeisotime(char * buff, size_t bufsize, const char * format, time_t t) +{ + static struct tm * stmp; + char * ibuff = NULL; + int i; + + ibuff = xmalloc(bufsize); + stmp = gmtime(&t); + strftime(ibuff, bufsize, format, stmp ); + i = snprintf(buff, bufsize, format, ibuff ); + xfree(ibuff); + return i; +} + + +static +int +writehms(char * buff, size_t bufsize, const char * format, time_t t, int gmt ) +{ + static struct tm * stmp; + + if (gmt) + stmp = gmtime(&t); + else + stmp = localtime(&t); + + return snprintf(buff, bufsize, format, + stmp->tm_hour, stmp->tm_min, stmp->tm_sec, + (stmp->tm_hour>=12?"PM":"AM") ); +} + static long time_to_yyyymmdd(time_t t) @@ -735,6 +832,14 @@ xcsv_parse_val(const char *s, waypoint *wpt, const field_map_t *fmp) /* altitude in meters as a decimal value */ wpt->altitude = atof(s); } else + + /* PATH CONVERSIONS ************************************************/ + if (strcmp(fmp->key, "PATH_SPEED") == 0) { + wpt->speed = atof(s); + } else + if (strcmp(fmp->key, "PATH_COURSE") == 0) { + wpt->course = atof(s); + } else /* TIME CONVERSIONS ***************************************************/ if (strcmp(fmp->key, "EXCEL_TIME") == 0) { @@ -748,7 +853,22 @@ xcsv_parse_val(const char *s, waypoint *wpt, const field_map_t *fmp) if (strcmp(fmp->key, "YYYYMMDD_TIME") == 0) { wpt->creation_time = yyyymmdd_to_time(s); } else - if (strcmp(fmp->key, "GEOCACHE_LAST_FOUND") == 0) { + if (strcmp(fmp->key, "GMT_TIME") == 0) { + wpt->creation_time = sscanftime(s, fmp->printfc, 1); + } else + if (strcmp(fmp->key, "LOCAL_TIME") == 0) { + wpt->creation_time = sscanftime(s, fmp->printfc, 0); + } else + /* Useful when time and date are in separate fields + GMT / Local offset is handled by the two cases above */ + if ((strcmp(fmp->key, "HMSG_TIME") == 0)|| + (strcmp(fmp->key, "HMSL_TIME") == 0) ) { + wpt->creation_time += addhms(s, fmp->printfc); + } else + if (strcmp(fmp->key, "ISO_TIME") == 0) { + wpt->creation_time = xml_parse_time(s); + } else + if (strcmp(fmp->key, "GEOCACHE_LAST_FOUND") == 0) { wpt->gc_data.last_found = yyyymmdd_to_time(s); } else @@ -775,6 +895,33 @@ xcsv_parse_val(const char *s, waypoint *wpt, const field_map_t *fmp) wpt->gc_data.placer = csv_stringtrim(s, "", 0); } else + /* GPS STUFF *******************************************************/ + if (strcmp(fmp->key, "GPS_HDOP") == 0) { + wpt->hdop = atof(s); + } else + if (strcmp(fmp->key, "GPS_VDOP") == 0) { + wpt->vdop = atof(s); + } else + if (strcmp(fmp->key, "GPS_PDOP") == 0) { + wpt->pdop = atof(s); + } else + if (strcmp(fmp->key, "GPS_SAT") == 0) { + wpt->sat = atoi(s); + } else + if (strcmp(fmp->key, "GPS_FIX") == 0) { + wpt->fix = atoi(s)-1; + if ( wpt->fix < fix_2d) { + if (!case_ignore_strcmp(s, "none")) + wpt->fix = fix_none; + else if (!case_ignore_strcmp(s, "dgps")) + wpt->fix = fix_dgps; + else if (!case_ignore_strcmp(s, "pps")) + wpt->fix = fix_pps; + else + wpt->fix = fix_unknown; + } + } else + /* OTHER STUFF ***************************************************/ if ( strcmp( fmp->key, "PATH_DISTANCE_MILES") == 0) { /* Ignored on input */ @@ -934,30 +1081,31 @@ xcsv_waypt_pr(const waypoint *wpt) i = 0; QUEUE_FOR_EACH(xcsv_file.ofield, elem, tmp) { + char *obuff; fmp = (field_map_t *) elem; if (i != 0) fprintf (xcsv_file.xcsvfp, write_delimiter); i++; - +#define writebuff(b, fmt, data) snprintf(b, sizeof(b), fmt, data) if (strcmp(fmp->key, "IGNORE") == 0) { /* IGNORE -- Write the char printf conversion */ - sprintf(buff, fmp->printfc, ""); + writebuff(buff, fmp->printfc, ""); } else if (strcmp(fmp->key, "INDEX") == 0) { - sprintf(buff, fmp->printfc, waypt_out_count + atoi(fmp->val)); + writebuff(buff, fmp->printfc, waypt_out_count + atoi(fmp->val)); } else if (strcmp(fmp->key, "CONSTANT") == 0) { const char *cp = xcsv_get_char_from_constant_table(fmp->val); if (cp) { - sprintf(buff, fmp->printfc, cp); + writebuff(buff, fmp->printfc, cp); } else { - sprintf(buff, fmp->printfc, fmp->val); + writebuff(buff, fmp->printfc, fmp->val); } } else if (strcmp(fmp->key, "SHORTNAME") == 0) { - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, (shortname && *shortname) ? shortname : fmp->val); } else if (strcmp(fmp->key, "ANYNAME") == 0) { @@ -976,16 +1124,16 @@ xcsv_waypt_pr(const waypoint *wpt) anyname = xstrdup(shortname); } - sprintf(buff, fmp->printfc, anyname); + writebuff(buff, fmp->printfc, anyname); xfree(anyname); } else if (strcmp(fmp->key, "DESCRIPTION") == 0) { - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, (description && *description) ? description : fmp->val); } else if (strcmp(fmp->key, "NOTES") == 0) { - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, (wpt->notes && *wpt->notes) ? wpt->notes : fmp->val); } else if (strcmp(fmp->key, "URL") == 0) { @@ -995,16 +1143,16 @@ xcsv_waypt_pr(const waypoint *wpt) off = strlen(xcsv_urlbase); } if (wpt->url) - sprintf(buff + off, fmp->printfc, wpt->url); + snprintf(buff + off, sizeof(buff) - off, fmp->printfc, wpt->url); else strcpy(buff, (fmp->val && *fmp->val) ? fmp->val : "\"\""); } else if (strcmp(fmp->key, "URL_LINK_TEXT") == 0) { - sprintf(buff, fmp->printfc, + snprintf(buff, sizeof(buff), fmp->printfc, (wpt->url_link_text && *wpt->url_link_text) ? wpt->url_link_text : fmp->val); } else if (strcmp(fmp->key, "ICON_DESCR") == 0) { - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, (wpt->icon_descr && *wpt->icon_descr) ? wpt->icon_descr : fmp->val); } else @@ -1012,51 +1160,51 @@ xcsv_waypt_pr(const waypoint *wpt) /* LATITUDE CONVERSION***********************************************/ if (strcmp(fmp->key, "LAT_DECIMAL") == 0) { /* latitude as a pure decimal value */ - sprintf(buff, fmp->printfc, wpt->latitude); + writebuff(buff, fmp->printfc, wpt->latitude); } else if (strcmp(fmp->key, "LAT_DECIMALDIR") == 0) { /* latitude as a decimal value with N/S after it */ - sprintf(buff, fmp->printfc, fabs(wpt->latitude), + snprintf(buff, sizeof(buff), fmp->printfc, fabs(wpt->latitude), LAT_DIR(wpt->latitude)); } else if (strcmp(fmp->key, "LAT_DIRDECIMAL") == 0) { /* latitude as a decimal value with N/S before it */ - sprintf(buff, fmp->printfc, + snprintf(buff, sizeof(buff), fmp->printfc, LAT_DIR(wpt->latitude), fabs(wpt->latitude)); } else if (strcmp(fmp->key, "LAT_INT32DEG") == 0) { /* latitude as an integer offset from 0 degrees */ - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, dec_to_intdeg(wpt->latitude, 1)); } else if (strcmp(fmp->key, "LAT_HUMAN_READABLE") == 0) { dec_to_human( buff, fmp->printfc, "SN", wpt->latitude ); } else if (strcmp(fmp->key, "LAT_NMEA") == 0) { - sprintf(buff, fmp->printfc, degrees2ddmm(wpt->latitude)); + writebuff(buff, fmp->printfc, degrees2ddmm(wpt->latitude)); } else /* LONGITUDE CONVERSIONS*********************************************/ if (strcmp(fmp->key, "LON_DECIMAL") == 0) { /* longitude as a pure decimal value */ - sprintf(buff, fmp->printfc, wpt->longitude); + writebuff(buff, fmp->printfc, wpt->longitude); } else if (strcmp(fmp->key, "LON_DECIMALDIR") == 0) { /* latitude as a decimal value with N/S after it */ - sprintf(buff, fmp->printfc, + snprintf(buff, sizeof(buff), fmp->printfc, fabs(wpt->longitude), LON_DIR(wpt->longitude)); } else if (strcmp(fmp->key, "LON_DIRDECIMAL") == 0) { /* latitude as a decimal value with N/S before it */ - sprintf(buff, fmp->printfc, + snprintf(buff, sizeof(buff), fmp->printfc, LON_DIR(wpt->longitude), fabs(wpt->longitude)); } else if (strcmp(fmp->key, "LON_INT32DEG") == 0) { /* longitudee as an integer offset from 0 degrees */ - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, dec_to_intdeg(wpt->longitude, 0)); } else if (strcmp(fmp->key, "LON_HUMAN_READABLE") == 0) { @@ -1069,87 +1217,150 @@ xcsv_waypt_pr(const waypoint *wpt) wpt->longitude ); } else if (strcmp(fmp->key, "LON_NMEA") == 0) { - sprintf(buff, fmp->printfc, degrees2ddmm(wpt->longitude)); + writebuff(buff, fmp->printfc, degrees2ddmm(wpt->longitude)); } else /* DIRECTIONS *******************************************************/ if (strcmp(fmp->key, "LAT_DIR") == 0) { /* latitude N/S as a char */ - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, LAT_DIR(wpt->latitude)); } else if (strcmp(fmp->key, "LON_DIR") == 0) { /* longitude E/W as a char */ - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, LON_DIR(wpt->longitude)); } else /* ALTITUDE CONVERSIONS**********************************************/ if (strcmp(fmp->key, "ALT_FEET") == 0) { /* altitude in feet as a decimal value */ - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, (wpt->altitude * 3.2808)); } else if (strcmp(fmp->key, "ALT_METERS") == 0) { /* altitude in meters as a decimal value */ - sprintf(buff, fmp->printfc, + writebuff(buff, fmp->printfc, wpt->altitude); } else /* DISTANCE CONVERSIONS**********************************************/ if (strcmp(fmp->key, "PATH_DISTANCE_MILES") == 0) { /* path (route/track) distance in miles */ - sprintf( buff, fmp->printfc, pathdist ); + writebuff( buff, fmp->printfc, pathdist ); } else if (strcmp(fmp->key, "PATH_DISTANCE_KM") == 0) { /* path (route/track) distance in */ - sprintf( buff, fmp->printfc, pathdist * 5280*12*2.54/100/1000 ); + writebuff( buff, fmp->printfc, pathdist * 5280*12*2.54/100/1000 ); + } else + if (strcmp(fmp->key, "PATH_SPEED") == 0) { + writebuff( buff, fmp->printfc, wpt->speed ); + } else + if (strcmp(fmp->key, "PATH_COURSE") == 0) { + writebuff( buff, fmp->printfc, wpt->course ); } else /* TIME CONVERSIONS**************************************************/ if (strcmp(fmp->key, "EXCEL_TIME") == 0) { /* creation time as an excel (double) time */ - sprintf(buff, fmp->printfc, TIMET_TO_EXCEL(wpt->creation_time)); + writebuff(buff, fmp->printfc, TIMET_TO_EXCEL(wpt->creation_time)); } else if (strcmp(fmp->key, "TIMET_TIME") == 0) { /* time as a time_t variable */ - sprintf(buff, fmp->printfc, wpt->creation_time); + writebuff(buff, fmp->printfc, wpt->creation_time); } else if (strcmp(fmp->key, "YYYYMMDD_TIME") == 0) { - sprintf(buff, fmp->printfc, time_to_yyyymmdd(wpt->creation_time)); + writebuff(buff, fmp->printfc, time_to_yyyymmdd(wpt->creation_time)); + } else + if (strcmp(fmp->key, "GMT_TIME") == 0) { + writetime(buff, sizeof buff, fmp->printfc, wpt->creation_time, 1 ); + } else + if (strcmp(fmp->key, "LOCAL_TIME") == 0) { + writetime(buff, sizeof buff, fmp->printfc, wpt->creation_time, 0 ); + } else + if (strcmp(fmp->key, "HMSG_TIME") == 0) { + writehms(buff, sizeof buff, fmp->printfc, wpt->creation_time, 1 ); + } else + if (strcmp(fmp->key, "HMSL_TIME") == 0) { + writehms(buff, sizeof buff, fmp->printfc, wpt->creation_time, 0 ); + } else + if (strcmp(fmp->key, "ISO_TIME") == 0) { + writetime(buff, sizeof buff, "%Y-%m-%dT%H:%M:%SZ", wpt->creation_time, 1 ); } else if (strcmp(fmp->key, "GEOCACHE_LAST_FOUND") == 0) { - sprintf(buff, fmp->printfc, time_to_yyyymmdd(wpt->gc_data.last_found)); + writebuff(buff, fmp->printfc, time_to_yyyymmdd(wpt->gc_data.last_found)); } else /* GEOCACHE STUFF **************************************************/ if (strcmp(fmp->key, "GEOCACHE_DIFF") == 0) { /* Geocache Difficulty as a double */ - sprintf(buff, fmp->printfc, wpt->gc_data.diff / 10.0); + writebuff(buff, fmp->printfc, wpt->gc_data.diff / 10.0); } else if (strcmp(fmp->key, "GEOCACHE_TERR") == 0) { /* Geocache Terrain as a double */ - sprintf(buff, fmp->printfc, wpt->gc_data.terr / 10.0); + writebuff(buff, fmp->printfc, wpt->gc_data.terr / 10.0); } else if (strcmp(fmp->key, "GEOCACHE_CONTAINER") == 0) { /* Geocache Container */ - sprintf(buff, fmp->printfc, gs_get_container(wpt->gc_data.container)); + writebuff(buff, fmp->printfc, gs_get_container(wpt->gc_data.container)); } else if (strcmp(fmp->key, "GEOCACHE_TYPE") == 0) { /* Geocache Type */ - sprintf(buff, fmp->printfc, gs_get_cachetype(wpt->gc_data.type)); + writebuff(buff, fmp->printfc, gs_get_cachetype(wpt->gc_data.type)); } else if (strcmp(fmp->key, "GEOCACHE_HINT") == 0) { - sprintf(buff, fmp->printfc, NONULL(wpt->gc_data.hint)); + writebuff(buff, fmp->printfc, NONULL(wpt->gc_data.hint)); } else if (strcmp(fmp->key, "GEOCACHE_PLACER") == 0) { - sprintf(buff, fmp->printfc, NONULL(wpt->gc_data.placer)); - } else { - /* this should probably never happen */ - } + writebuff(buff, fmp->printfc, NONULL(wpt->gc_data.placer)); + } else + + /* GPS STUFF *******************************************************/ + if (strcmp(fmp->key, "GPS_HDOP") == 0) { + writebuff(buff, fmp->printfc, wpt->hdop); + } else + if (strcmp(fmp->key, "GPS_VDOP") == 0) { + writebuff(buff, fmp->printfc, wpt->vdop); + } else + if (strcmp(fmp->key, "GPS_PDOP") == 0) { + writebuff(buff, fmp->printfc, wpt->pdop); + } else + if (strcmp(fmp->key, "GPS_SAT") == 0) { + writebuff(buff, fmp->printfc, wpt->sat); + } else + if (strcmp(fmp->key, "GPS_FIX") == 0) { + char *fix = NULL; + switch (wpt->fix) { + case fix_unknown: + fix = "Unknown"; + break; + case fix_none: + fix = "None"; + break; + case fix_2d: + fix = "2d"; + break; + case fix_3d: + fix = "3d"; + break; + case fix_dgps: + fix = "dgps"; + break; + case fix_pps: + fix = "pps"; + break; + } + writebuff(buff, fmp->printfc, fix); + } else - fprintf (xcsv_file.xcsvfp, "%s", buff); + { + /* this should probably never happen */ + } + + obuff = csv_stringclean(buff, xcsv_file.badchars); + fprintf (xcsv_file.xcsvfp, "%s", obuff); + xfree(obuff); } fprintf (xcsv_file.xcsvfp, "%s", xcsv_file.record_delimiter); diff --git a/defs.h b/defs.h index 4ac800dcb..a0b5eeb62 100644 --- a/defs.h +++ b/defs.h @@ -36,6 +36,9 @@ # define M_PI 3.14159265358979323846 #endif +#define FEET_TO_METERS(feetsies) ((feetsies) * 0.3048) +#define METERS_TO_FEET(meetsies) ((meetsies) * 3.2808399) + /* * Snprintf is in SUS (so it's in most UNIX-like substance) and it's in * C99 (albeit with slightly different semantics) but it isn't in C89. @@ -43,6 +46,7 @@ */ #if __WIN32__ # define snprintf _snprintf +# define vsnprintf _vsnprintf #endif /* Turn off numeric conversion warning */ @@ -69,6 +73,15 @@ typedef enum { rtedata } gpsdata_type; +typedef enum { + fix_unknown=-1, + fix_none=0, + fix_2d=1, + fix_3d, + fix_dgps, + fix_pps +} fix_type; + #define NOTHINGMASK 0 #define WPTDATAMASK 1 #define TRKDATAMASK 2 @@ -158,12 +171,32 @@ typedef struct xml_tag { struct xml_tag *child; } xml_tag ; -typedef void (*an1_destroy)(void *); -typedef void (*an1_copy)(void **, void *); -typedef struct { - an1_destroy destroy; - an1_copy copy; -} an1_base; +typedef void (*fs_destroy)(void *); +typedef void (*fs_copy)(void **, void *); +typedef struct format_specific_data { + long type; + struct format_specific_data *next; + + fs_destroy destroy; + fs_copy copy; +} format_specific_data; + +format_specific_data *fs_chain_copy( format_specific_data *source ); +void fs_chain_destroy( format_specific_data *chain ); +format_specific_data *fs_chain_find( format_specific_data *chain, long type ); +void fs_chain_add( format_specific_data **chain, format_specific_data *data ); + +typedef struct fs_xml { + format_specific_data fs; + xml_tag *tag; +} fs_xml; + +fs_xml *fs_xml_alloc( long type ); + +#define FS_GPX 0x67707800L +#define FS_AN1W 0x616e3177L +#define FS_AN1L 0x616e316cL +#define FS_AN1V 0x616e3176L /* * Misc bitfields inside struct waypoint; @@ -241,10 +274,20 @@ typedef struct { * nice enough to use exactly the same priority scheme. */ int route_priority; + + /* Optional dilution of precision: positional, horizontal, veritcal. + * 1 <= dop <= 50 + */ + float hdop; + float vdop; + float pdop; + float course; /* Optional: degrees true */ + float speed; /* Optional: meters per second. */ + fix_type fix; /* Optional: 3d, 2d, etc. */ + int sat; /* Optional: number of sats used for fix */ geocache_data gc_data; - xml_tag *gpx_extras; - an1_base *an1_extras; + format_specific_data *fs; void *extra_data; /* Extra data added by, say, a filter. */ } waypoint; @@ -255,7 +298,7 @@ typedef struct { char *rte_desc; int rte_num; int rte_waypt_ct; /* # waypoints in waypoint list */ - an1_base *an1_extras; + format_specific_data *fs; } route_head; /* @@ -461,6 +504,7 @@ void waypt_status_disp(int total_ct, int myct); void fatal(const char *, ...) #if __GNUC__ __attribute__ ((__format__ (__printf__, 1, 2))) + __attribute__((noreturn)) #endif ; void warning(const char *, ...) @@ -535,15 +579,23 @@ char *strsub(const char *s, const char *search, const char *replace); char *gstrsub(const char *s, const char *search, const char *replace); void rtrim(char *s); signed int get_tz_offset(void); +time_t mkgmtime(struct tm *t); time_t current_time(void); signed int month_lookup(const char *m); const char *get_cache_icon(const waypoint *waypointp); +const char *gs_get_cachetype(geocache_type t); char * xml_entitize(const char * str); char * html_entitize(const char * str); char * strip_html(const utf_string*); char * strip_nastyhtml(const char * in); -char * str_utf8_to_cp1252( const char * str ); -char * str_utf8_to_ascii( const char * str ); + +/* + * Character encoding transformations. + */ +char * str_utf8_to_cp1252(const char * str); +char * str_utf8_to_ascii(const char * str); +char * str_iso8859_1_to_utf8(const char *str ); + /* this lives in gpx.c */ time_t xml_parse_time( const char *cdatastr ); diff --git a/discard.c b/discard.c new file mode 100644 index 000000000..7ecca8152 --- /dev/null +++ b/discard.c @@ -0,0 +1,141 @@ +/* + Discard points based on high Degree of Precision (DOP) values. + + Copyright (C) 2005 Robert Lipe, robertlipe@usa.net + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ +#include +#include "defs.h" + +extern queue waypt_head; + +static char *hdopopt = NULL; +static char *vdopopt = NULL; +static char *andopt = NULL; +static double hdopf; +static double vdopf; + +static +arglist_t fix_args[] = { + {"hdop", &hdopopt, "Suppress waypoints with higher hdop", + "-1.0", ARGTYPE_BEGIN_REQ | ARGTYPE_FLOAT}, + {"vdop", &vdopopt, "Suppress waypoints with higher vdop", + "-1.0", ARGTYPE_END_REQ | ARGTYPE_FLOAT}, + {"hdopandvdop", &andopt, "Link hdop and vdop supression with AND", + NULL, ARGTYPE_BOOL}, + {0, 0, 0, 0, 0} +}; + +static void +fix_process_track(const route_head *trk) +{ + waypoint * waypointp; + queue *elem, *tmp; + + QUEUE_FOR_EACH((queue *)&trk->waypoint_list, elem, tmp) { + + int del = 0; + int delh = 0; + int delv = 0; + + waypointp = (waypoint *)elem; + + if ((hdopf >= 0.0) && (waypointp->hdop > hdopf)) + delh = 1; + if ((vdopf >= 0.0) && (waypointp->vdop > vdopf)) + delv = 1; + + if (andopt) + del = delh && delv; + else + del = delh || delv; + + if (del) { + waypt_del(waypointp); + waypt_free(waypointp); + } + + } +} + +void +fix_process(void) +{ + waypoint * waypointp; + queue *elem, *tmp; + extern queue waypt_head; + + // Filter waypoints + + QUEUE_FOR_EACH(&waypt_head, elem, tmp) { + + int del = 0; + int delh = 0; + int delv = 0; + + waypointp = (waypoint *)elem; + + if ((hdopf >= 0.0) && (waypointp->hdop > hdopf)) + delh = 1; + if ((vdopf >= 0.0) && (waypointp->vdop > vdopf)) + delv = 1; + + if (andopt) + del = delh && delv; + else + del = delh || delv; + + if (del) { + waypt_del(waypointp); + waypt_free(waypointp); + } + + } + + // Filter tracks + track_disp_all(fix_process_track, NULL, NULL); + + // And routes + route_disp_all(fix_process_track, NULL, NULL); + +} + +void +fix_init(const char *args) +{ + if (hdopopt) + hdopf = atof(hdopopt); + else + hdopf = -1.0; + if (vdopopt) + vdopf = atof(vdopopt); + else + vdopf = -1.0; +} + +void +fix_deinit(void) +{ +} + +filter_vecs_t discard_vecs = { + fix_init, + fix_process, + fix_deinit, + NULL, + fix_args +}; diff --git a/easygps.c b/easygps.c index bcfab3f03..7d804e3c7 100644 --- a/easygps.c +++ b/easygps.c @@ -120,6 +120,7 @@ data_read(void) break; case 7: wpt_tmp->icon_descr = (char *) pread(); + wpt_tmp->wpt_flags.icon_descr_is_dynamic = 1; break; case 8: /* NULL Terminated (vs. pascal) descr */ bbufp = bbuf; diff --git a/filter_skeleton.c b/filter_skeleton.c new file mode 100644 index 000000000..abff8df11 --- /dev/null +++ b/filter_skeleton.c @@ -0,0 +1,77 @@ +/* + + Filter skeleton: + + Simple copy this file to .c and + rename all filter_skeleton tokens to . Replace + the stupid name and address in the Copyright few lines below. + To active your new filter you have to create a new section in + filter_vecs and finally add complying statements to Makefile. + + Copyright (C) YYYY John Doe, anybody@wherever.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#include "defs.h" +#include + +#define MYNAME "filter_skeleton" + + +// Any arg in this list will appear in command line help and will be +// populated for you. +static +arglist_t filter_skeleton_args[] = { +// {"foo", &fooopt, "The text of the foo option in help", +// "default", ARGYTPE_STRING} , + {0, 0, 0, 0, 0} +}; + +/******************************************************************************* +* %%% global callbacks called by gpsbabel main process %%% * +*******************************************************************************/ + +static void +filter_skeleton_init(const char *args) /* optional */ +{ +} + +static void +filter_skeleton_process(void) /* this procedure must be present in vecs */ +{ +// Here is how you register callbacks for all waypoints, routes, tracks. +// waypt_disp_all(waypt) +// route_disp_all(head, tail, rtept); +// track_disp_all(head, tail, trkpt); +} + +static void +filter_skeleton_deinit(void) /* optional */ +{ +} + +/*******************************************************************************/ + +filter_vecs_t filter_skeleton_vecs = { + filter_skeleton_init, + filter_skeleton_process, + filter_skeleton_deinit, + NULL, + filter_skeleton_args +}; + +/*******************************************************************************/ diff --git a/filter_vecs.c b/filter_vecs.c index 238d93e10..1aa5ca1b4 100644 --- a/filter_vecs.c +++ b/filter_vecs.c @@ -37,6 +37,8 @@ extern filter_vecs_t routesimple_vecs; extern filter_vecs_t reverse_route_vecs; extern filter_vecs_t sort_vecs; extern filter_vecs_t stackfilt_vecs; +extern filter_vecs_t trackfilter_vecs; +extern filter_vecs_t discard_vecs; static fl_vecs_t filter_vec_list[] = { @@ -85,6 +87,16 @@ fl_vecs_t filter_vec_list[] = { "stack", "Save and restore waypoint lists" }, + { + &trackfilter_vecs, + "track", + "Manipulate track lists" + }, + { + &discard_vecs, + "discard", + "Remove unreliable points with high hdop or vdop" + }, { NULL, NULL, @@ -204,7 +216,7 @@ alpha (const void *a, const void *b) const fl_vecs_t *const ap = a; const fl_vecs_t *const bp = b; - return strcasecmp(ap->desc , bp->desc); + return case_ignore_strcmp(ap->desc , bp->desc); } /* diff --git a/formspec.c b/formspec.c new file mode 100644 index 000000000..1c20c53c9 --- /dev/null +++ b/formspec.c @@ -0,0 +1,65 @@ +/* + Functions to manage the format_specific_data chain + + Copyright (C) 2005 Ron Parker and Robert Lipe. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#include +#include +#include + +#include "defs.h" + +format_specific_data *fs_chain_copy( format_specific_data *source ) { + format_specific_data *result = NULL; + + format_specific_data **copy = &result; + while ( source ) { + source->copy( (void **)copy, (void *)source ); + copy = &((*copy)->next); + source = source->next; + } + return result; +} + +void fs_chain_destroy( format_specific_data *chain ) { + format_specific_data *cur = chain; + format_specific_data *next = NULL; + while ( cur ) { + next = cur->next; + cur->destroy( cur ); + cur = next; + } +} + +format_specific_data *fs_chain_find( format_specific_data *chain, long type ) { + format_specific_data *cur = chain; + while ( cur ) { + if (cur->type == type ) { + return cur; + } + cur = cur->next; + } + return NULL; +} + +void fs_chain_add( format_specific_data **chain, format_specific_data *data ) { + data->next = *chain; + *chain = data; +} + diff --git a/garmin.c b/garmin.c index a25b363c0..935266c29 100644 --- a/garmin.c +++ b/garmin.c @@ -51,7 +51,7 @@ arglist_t garmin_args[] = { NULL, ARGTYPE_BOOL}, { "power_off", &poweroff, "Command unit to power itself down", NULL, ARGTYPE_BOOL}, - { 0, 0, 0, 0} + { 0, 0, 0, 0, 0} }; static const char * d103_symbol_from_icon_number(unsigned int n); @@ -696,7 +696,7 @@ d103_symbol_from_icon_number(unsigned int n) static int d103_icon_number_from_symbol(const char *s) { - int i; + unsigned int i; if (NULL == s) { return 0; diff --git a/garmin_tables.c b/garmin_tables.c index f0d979083..2a63833f7 100644 --- a/garmin_tables.c +++ b/garmin_tables.c @@ -101,6 +101,7 @@ icon_mapping_t garmin_icon_table[] = { { 12, 12, "Light" }, { 90, 8221, "Live Theater" }, { 59, 173, "Lodging" }, + { 59, 173, "Hotel" }, { 20, 21, "Man Overboard" }, { 0, 0, "Marina" }, { 43, 156, "Medical Facility" }, diff --git a/gdb.c b/gdb.c new file mode 100644 index 000000000..2db870f5d --- /dev/null +++ b/gdb.c @@ -0,0 +1,1694 @@ +/* + Garmin GPS Database Reader/Writer + + Copyright (C) 2005 Olaf Klein, o.b.klein@t-online.de + Mainly based on mapsource.c, + Copyright (C) 2005 Robert Lipe, robertlipe@usa.net + + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA +*/ + +/* + History: + + 2005/06/27: initial release (reader only) + 2005/07/26: added write support + 2005/07/27: replaced "tricky code" in route reader + 2005/07/28: fixed handling of single point routes + new option "via" + new option "ver" + fixed compiler warnings + 2005/07/29: fixed compiler warnings +*/ + +#include +#include +#include + +#include "defs.h" +#include "garmin_tables.h" +#include "jeeps/gpsmath.h" + +#define MYNAME "gdb" + +#undef GDB_DEBUG + +#define GDB_VER_MIN 1 +#define GDB_VER_MAX 2 + +#define GDB_DEFAULTWPTCLASS 0 +#define GDB_HIDDENROUTEWPTCLASS 8 + +#define GDB_NAME_BUFFERLEN 1024 +#define GDB_URL_BUFFERLEN 4096 /* Safety first */ +#define GDB_NOTES_BUFFERLEN 4096 /* (likewise) */ + +#define DEFAULTICONVALUE 18 +#define DEFAULTICONDESCR "Waypoint" + +#ifdef UTF8_SUPPORT +# define GDB_UTF8_ENABLED 1 +#else +# define GDB_UTF8_ENABLED 0 +#endif + +typedef enum { + GDB_DISPLAY_SYMBOL_ONLY = 0, + GDB_DISPLAY_SYMBOL_AND_NAME = 1, + GDB_DISPLAY_SYMBOL_AND_COMMENT = 2, +} gdb_display_type; + +/* %%% local vars %%% */ + +FILE *fin, *fout; +static char *fin_name, *fout_name; + +static int gdb_ver = 1; +static int gdb_debug = 0; +static int gdb_via; /* 0 = read and write hidden points too; 1 = drop */ +static int gdb_category; + +route_head *gdb_hidden = NULL; + + +#define GDB_OPT_VER "ver" +#define GDB_OPT_VIA "via" +#define GDB_OPT_CATEGORY "cat" + +static char *gdb_opt_category = NULL; +static char *gdb_opt_ver = NULL; +static char *gdb_opt_via = NULL; + +static arglist_t gdb_args[] = { + {GDB_OPT_CATEGORY, &gdb_opt_category, + "Default category on output (1..16)", NULL, ARGTYPE_INT}, + {GDB_OPT_VER, &gdb_opt_ver, + "Version of gdb file to generate (1,2)", "2", ARGTYPE_INT}, + {GDB_OPT_VIA, &gdb_opt_via, + "Drop route points, if they don't have an aquivalent waypoint (hidden points)", NULL, ARGTYPE_BOOL}, + {0, 0, 0, 0, 0} +}; + +/********************************************************************************************************/ + +/* %%% 1-1 functions from mapsource, should by shared!!! %%% */ + +/* + * Add a waypoint that we've already written out to our list + * + */ +static void +gdb_add_to_hidden(const waypoint *wpt) +{ + waypoint *tmp = waypt_dupe(wpt); + route_add_wpt(gdb_hidden, tmp); +} + +static waypoint * +gdb_find_wpt_q_by_name(const queue *whichQueue, const char *name) +{ + queue *elem, *tmp; + waypoint *waypointp; + + QUEUE_FOR_EACH(whichQueue, elem, tmp) { + waypointp = (waypoint *) elem; + if (0 == strcmp(waypointp->shortname, name)) { + return waypointp; + } + } + return NULL; +} + +static const char * +gdb_find_desc_from_icon_number(const int icon, garmin_formats_e garmin_format) +{ + static char custom[] = "Custom 63"; + icon_mapping_t *i; + + if (icon >= 500 && icon <= 563) + { + snprintf(custom, sizeof(custom), "Custom %d", icon - 500); + return &custom[0]; + } + + for (i = garmin_icon_table; i->icon; i++) { + switch (garmin_format) { + case MAPSOURCE: + if (icon == i->mpssymnum) + return i->icon; + break; + case PCX: + case GARMIN_SERIAL: + if (icon == i->pcxsymnum) + return i->icon; + break; + default: + fatal(MYNAME ": unknown garmin format.\n"); + } + } + return DEFAULTICONDESCR; +} + +static int +gdb_find_icon_number_from_desc(const char *desc, garmin_formats_e garmin_format) +{ + icon_mapping_t *i; + int def_icon = DEFAULTICONVALUE; + int n; + + if (!desc) + return def_icon; + + /* + * If we were given a numeric icon number as a description + * (i.e. 8255), just return that. + */ + n = atoi(desc); + if (n) { + return n; + } + + for (i = garmin_icon_table; i->icon; i++) { + if (case_ignore_strcmp(desc,i->icon) == 0) { + switch (garmin_format) { + case MAPSOURCE: + return i->mpssymnum; + case PCX: + case GARMIN_SERIAL: + return i->pcxsymnum; + default: + fatal(MYNAME ": unknown garmin format.\n"); + } + } + } + return def_icon; +} + +static int +gdb_detect_rtept_class(const waypoint *wpt) +{ + if (gdb_find_wpt_q_by_name((queue *)&gdb_hidden->waypoint_list, wpt->shortname) == NULL) + return (int)GDB_HIDDENROUTEWPTCLASS; + else + return (int)GDB_DEFAULTWPTCLASS; +} + + +#ifndef UTF8_SUPPORT +static char *gdb_garmin_to_utf8(const char *s) +{ + int len; + char *res; + unsigned char c; + char *src, *dst; + + if (s == NULL) return NULL; + + len = 0; + src = (char *)s; + while ('\0' != (c = *src++)) + { + len++; + if (c & 0x80) len++; + if (c == 0x80) len++; + } + + src = (char *)s; + dst = res = (void *) xmalloc(len + 1); + while ('\0' != (c = *src++)) + { + if (c == 0x80) + { + *dst++ = 0xe2; + *dst++ = 0x82; + *dst++ = 0xac; + } + else if (c & 0x80) + { + *dst++ = (0xc0 | (c >> 6)); + *dst++ = (c & 0xbf); + } + else + { + *dst++ = c; + } + } + *dst = '\0'; + return res; +} +#endif + +/* %%% local functions (read support) %%% */ + +static char * +gdb_convert_name_buff(char *buff, size_t buffsize) +{ +#ifdef UTF8_SUPPORT + char *tmp = str_garmin_to_utf8(buff); +#else + char *tmp = gdb_garmin_to_utf8(buff); +#endif + strncpy(buff, tmp, buffsize); + xfree(tmp); + return buff; +} + +#ifdef GDB_DEBUG +static void +gdb_print_buff(const char *buff, int count, const char *comment) +{ + int i; + printf(MYNAME ": dump of %s : ", comment); + for (i = 0; i < count; i++) + { + printf("%02x ", buff[i] & 0xFF); + } + printf("\n"); + fflush(stdout); +} +#endif + +static waypoint * +gdb_create_rte_wpt(const char *name, double lat, double lon, double alt) +{ + waypoint *wpt; + + wpt = find_waypt_by_name(name); + if (wpt == NULL) + { + if (gdb_via != 0) return NULL; + wpt = gdb_find_wpt_q_by_name((queue *)&gdb_hidden->waypoint_list, name); + } + if (wpt != NULL) + wpt = waypt_dupe(wpt); + else + { + wpt = waypt_new(); + wpt->shortname = xstrdup(name); + wpt->latitude = lat; + wpt->longitude = lon; + wpt->altitude = alt; + wpt->depth = unknown_alt; + } + return wpt; +} + +static size_t +gdb_fread(void *target, size_t size) +{ + size_t result; + + result = fread(target, 1, size, fin); + if (result < size) + { + if (feof(fin) != 0) + fatal(MYNAME ": unexpected end of file \"%s\"!\n", fin_name); + else + fatal(MYNAME ": I/O error occured during read from \"%s\"!\n", fin_name); + } + return result; +} + +static int +gdb_fread_str(char *dest, size_t maxlen) +{ + int c; + int res = 0; + + while (maxlen-- > 0) + { + c = fgetc(fin); + if ( c != EOF ) + { + if (c < 0) + fatal(MYNAME ": I/O error (%d) while read from \"%s\"!\n", +c, fin_name); + *dest++ = c; + if ( c == 0 ) return res; + res++; + } + else + { + *dest++ = '\0'; + return res; + } + } + fatal(MYNAME ": local buffer overflow detected, please report!\n"); +} + +static int +gdb_fread_le(void *dest, size_t size, int bit_count, const char *prefix, const char *field) +{ + char buff[32]; + unsigned char *c = dest; + short *sh = dest; + int *li = dest; + double *db = dest; + + if ((bit_count >> 3) != size) + fatal(MYNAME "%s: Internal error (gdb_le_read/%d/%d/%s)!\n", prefix, (int)size, bit_count >> 3, field); + + switch(bit_count) + { + case 8: + gdb_fread(c, sizeof(*c)); + if (gdb_debug) + printf(MYNAME "%s: gdb_fread_le : %d -> %s (0x%x))\n", prefix, *c, field, *c); + return *c; + case 16: + if (sizeof(*sh) != size) fatal(MYNAME ": internal decl.!\n"); + gdb_fread(sh, sizeof(*sh)); + *sh = le_read16(sh); + if (gdb_debug) + printf(MYNAME "%s: gdb_fread_le : %d -> %s (0x%x))\n", prefix, *sh, field, *sh); + return *sh; + case 32: + gdb_fread(li, 4); + *li = le_read32(li); + if (gdb_debug) + printf(MYNAME "%s: gdb_fread_le : %d -> %s (0x%x)\n", prefix, *li, field, *li); + return *li; + case 64: + gdb_fread(buff, sizeof(*db)); + le_read64(db, buff); + if (gdb_debug) + printf(MYNAME "%s: gdb_fread_le : %g -> %s\n", prefix, *db, field); + return 0; + default: + fatal(MYNAME "%s: unsupported bit count (%d) in gdb_le_read!\n", prefix, bit_count); + } +} + +static int +gdb_fread_flag(const char value) /* read one byte and compare to value */ +{ + char c; + + gdb_fread(&c, 1); + return (c == value); +} + +static void +gdb_is_valid(int is, const char *prefix, const char *comment) +{ + if (is == 0) + { + printf(MYNAME ": Reading database \"%s\"\n", fin_name); + fatal(MYNAME "-%s: Found error in data (%s)!\n", prefix, comment); + } +} + +static void +gdb_is_validf(int is, const char *prefix, const char *format, ...) +{ + va_list args; + + if (is != 0) return; + + va_start(args, format); + if (fin_name != NULL) + printf(MYNAME "-%s: Reading from database \"%s\"\n", prefix, fin_name); + else + printf(MYNAME "-%s: Writing to database \"%s\"\n", prefix, fout_name); + printf(MYNAME "-%s: ", prefix); + vprintf(format, args); + va_end(args); + + fatal("\n"); +} + +/********************************************************************************************************/ +/* %%% read file header */ +/********************************************************************************************************/ + +static void +gdb_read_file_header(void) +{ + char buff[128]; + int i, reclen; + + const char *prefix = "read_head"; +/* + We starts with standard binary read. + A gdb_fread_str works too, but if we get a wrong file as input, + the file validation my be comes too late. For example a XML base file normally + has no binary zeros inside and produce, if big enought, a buffer overflow. + The following message "local buffer overflow detected..." could be + misinterpreted. +*/ + + if (6 != fread(buff, 1, 6, fin)) + fatal(MYNAME ": Invalid file \"%s\"!\n", fin_name); + + if (strcmp(buff, "MsRcf") != 0) + fatal(MYNAME ": Invalid file \"%s\"!\n", fin_name); + + gdb_fread(&reclen, 4); + reclen = le_read32(&reclen); + + gdb_is_valid(reclen == gdb_fread_str(buff, sizeof(buff)), prefix, "Invalid record length"); + if (buff[0] != 'D') + fatal(MYNAME ": Invalid file \"%s\"!\n", fin_name); + + switch(buff[1]) + { + case 'k': + gdb_ver = 1; + break; + case 'l': + gdb_ver = 2; + break; + default: + fatal(MYNAME ": Non supported GDB version!\n"); + } + + if (global_opts.verbose_status > 0) + printf(MYNAME ": Found Garmin GPS Database version %d.0\n", gdb_ver); + + gdb_fread(&reclen, 4); + reclen = le_read32(&reclen); + gdb_is_valid(reclen < sizeof(buff), prefix, "Invalid record length"); + gdb_fread(buff, reclen); + + gdb_is_valid(0 == gdb_fread_str(buff, sizeof(buff)), prefix, "header"); + + i = gdb_fread_str(buff, sizeof(buff)); + gdb_is_valid((i == 9) && (strcmp(buff, "MapSource") == 0), prefix, "MapSource magic"); +} + +/********************************************************************************************************/ +/* %%% read waypoint */ +/********************************************************************************************************/ + +static waypoint * +gdb_read_wpt(const size_t fileofs, int *wptclass) +{ + char xname[GDB_NAME_BUFFERLEN]; + char xnotes[GDB_NOTES_BUFFERLEN]; + char xurl[GDB_URL_BUFFERLEN]; + int xclass; + int xlat, xlon, xdisplay, xcolour, xicon, xtime; + short xcat; + double xdepth = unknown_alt; + double xalt = unknown_alt; + double xproximity = unknown_alt; + waypoint *res; + char buff[128]; + size_t pos, delta; + + const char *prefix = "wpt_read"; + + +/********************************************************************************************************/ +/* record structure + + zstring name + dword class + zstring country + 4 * 0x00 subclass part 1 + 12 * 0xFF subclass part 2 + 2 * 0x00 subclass part 3 + 4 * 0xFF unknown + dword latitude + dword longitude + if (1) +8 altitude = (1 or 9) + zstring comment + dword display flag + dword display colour + dword icon + zstring city ? + zstring state ? + zstring facility ? + char unknown ? + double depth (if flag) + zstring url + word category -> offset 79 + double temp (if flag) + */ +/********************************************************************************************************/ + + gdb_is_valid(gdb_fread_str(xname, sizeof(xname)) > 0, prefix, "new waypoint"); + gdb_convert_name_buff(xname, sizeof(xname)); + + gdb_fread_le(&xclass, sizeof(xclass), 32, prefix, "class"); + gdb_fread_str(buff, sizeof(buff)); /* country */ + + gdb_fread(buff, 22); + xlat = gdb_fread_le(&xlat, sizeof(xlat), 32, prefix, "latitude"); + xlon = gdb_fread_le(&xlon, sizeof(xlon), 32, prefix, "longitude"); + + if (gdb_fread_flag(1)) /* altitude flag */ + gdb_fread_le(&xalt, sizeof(xalt), 64, prefix, "altitude"); + + gdb_fread_str(xnotes, sizeof(xnotes)); /* notes */ + gdb_convert_name_buff(xnotes, sizeof(xnotes)); + + if (gdb_fread_flag(1)) /* proximity flag */ + gdb_fread_le(&xproximity, sizeof(xproximity), 64, prefix, "proximity"); + + xdisplay = gdb_fread_le(&xdisplay, sizeof(xdisplay), 32, prefix, "display"); + xcolour = gdb_fread_le(&xcolour, sizeof(xcolour), 32, prefix, "colour"); + xicon = gdb_fread_le(&xicon, sizeof(xicon), 32, prefix, "icon"); + + gdb_fread_str(buff, sizeof(buff)); /* city */ + gdb_fread_str(buff, sizeof(buff)); /* state */ + gdb_fread_str(buff, sizeof(buff)); /* facility */ + + gdb_fread(buff, 1); /* unknown */ + + if (gdb_fread_flag(1)) /* depth flag */ + gdb_fread_le(&xdepth, sizeof(xdepth), 64, prefix, "depth"); + + gdb_fread(buff, 1); + gdb_fread(buff, 1); + + if (gdb_fread_flag(0)) + gdb_fread(buff, 4); + else + gdb_fread(buff, 3); + + gdb_fread_str(xurl, sizeof(xurl)); + gdb_convert_name_buff(xurl, sizeof(xurl)); + + xcat = gdb_fread_le(&xcat, sizeof(xcat), 16, prefix, "category"); + + if (gdb_fread_flag(1)) /* temperature flag */ + gdb_fread(buff, 8); /* temperature */ + + /* Here comes 1 .. 6 unknown bytes + !!! 6 only if class > 0 !!! + the field seems to be a time stamp */ + + pos = ftell(fin); + delta = fileofs - pos; + gdb_is_valid(delta > 0, prefix, "waypoint final"); + + if ((delta & 1) == 0) + { + gdb_fread(buff, 1); + delta--; + } + + xtime = 0; + if (gdb_fread_flag(1)) + { + gdb_is_valid(delta==5, prefix, "Waypoint time"); + gdb_fread_le(&xtime, sizeof(xtime), 32, prefix, "time"); + } + else + gdb_is_valid(delta==1, prefix, "No waypoint time"); + + *wptclass = xclass; + + res = waypt_new(); + res->shortname = xstrdup(xname); + if (xurl[0] != '\0') res->url = xstrdup(xurl); + if (xnotes[0] != '\0') res->notes = xstrdup(xnotes); + res->latitude = GPS_Math_Semi_To_Deg(xlat); + res->longitude = GPS_Math_Semi_To_Deg(xlon); + res->altitude = xalt; + res->creation_time = xtime; +#if 0 + res->depth = xdepth; + res->proximity = xproximity; + res->garmin_data = xcalloc(1, sizeof(garmin_data_t)); + res->garmin_data->colour = xcolour; + res->garmin_data->category = xcat; + res->garmin_data->display = xdisplay; +#endif + /* might need to change this to handle version dependent icon handling */ + res->icon_descr = gdb_find_desc_from_icon_number(xicon, MAPSOURCE); + + gdb_is_validf(fabs(res->latitude) <= 90.0, prefix, "%s has invalid latitude (%f)", + res->shortname, res->latitude); + + return res; +} + +/********************************************************************************************************/ +/* %%% read route */ +/********************************************************************************************************/ + +static route_head * +gdb_read_route(void) +{ + char xname[GDB_NAME_BUFFERLEN]; + char xwptname[GDB_NAME_BUFFERLEN]; + int xclass; + double xalt; + double xlat = 0; /* compiler warnings */ + double xlon = 0; /* compiler warnings */ + + char buff[256]; + int count, origin; + int isteps; + int semilat, semilon; + int maxlat, maxlon, minlon, minlat; + char auto_name; + + route_head *route; + waypoint *wpt; + + const char *prefix = "rte_read_head"; + const char *prefix1 = "rte_read_loop"; + const char *prefix2 = "rte_ils_loop"; + const char *prefix3 = "rte_read_final"; + + gdb_is_valid(gdb_fread_str(xname, sizeof(xname)) > 0, prefix, "Route has no name"); + gdb_convert_name_buff(xname, sizeof(xname)); + + gdb_fread_le(&auto_name, sizeof(auto_name), 8, prefix, "auto name"); + if (gdb_fread_flag(0)) /* max. data flag */ + { + gdb_fread_le(buff, 4, 32, prefix, "max. latitude"); + gdb_fread_le(buff, 4, 32, prefix, "max. longitude"); + + gdb_fread(buff, 1); + if (buff[0] == 1) gdb_fread_le(buff, 8, 64, prefix, "max. altitude"); + + gdb_fread_le(buff, 4, 32, prefix, "min. latitude"); + gdb_fread_le(buff, 4, 32, prefix, "min. longitude"); + + gdb_fread(buff, 1); + if (buff[0] == 1) + gdb_fread_le(buff, 8, 64, prefix, "min. altitude"); + } + + gdb_fread_le(&count, sizeof(count), 32, prefix, "count"); + + if (count == 0) + fatal(MYNAME "%s: !!! Empty routes are not allowed !!!\n", prefix); + + route = route_head_alloc(); + route->rte_name = xstrdup(xname); + route_add_head(route); + +#ifdef GDB_DEBUG + printf(MYNAME " - route: \"%s\" with %d point(s)\n", xname, count); +#endif + origin = count; + + while (count--) + { + gdb_fread_str(xwptname, sizeof(xwptname)); /* waypoint name */ + gdb_convert_name_buff(xwptname, sizeof(xwptname)); + + gdb_fread_le(&xclass, sizeof(xclass), 32, prefix1, "class"); /* class */ + gdb_fread_str(buff, sizeof(buff)); /* country */ + + gdb_fread(buff, 22); /* sub class data */ + gdb_fread(buff, 1); + gdb_is_valid(buff[0] == 0, prefix1, "Should by zero byte (1)"); + + /* The next thing is the unknown 0x03 0x00 .. 0x00 (18 bytes) */ + /* OK: this should be, but i've seen exceptions (...cannot verify the first byte */ + gdb_fread(buff, 18); + + gdb_fread_le(&isteps, sizeof(isteps), 32, prefix1, "interlink steps"); + + if (isteps <= 0) /* ??? end of route or error ??? */ + { + gdb_is_valid(count == 0, prefix3, "Zero interlink steps within route"); + + gdb_fread(buff, 1); + gdb_is_valid((buff[0] == 1), prefix3, "last seq.(1)"); + + if (gdb_ver > 1) + gdb_fread(buff, 8); /* Unknown 8 bytes since gdb v2 */ + + gdb_fread(buff, 1); + gdb_is_valid((buff[0] == 0), prefix3, "last seq.(2)"); + + wpt = gdb_create_rte_wpt(xwptname, xlat, xlon, xalt); + if (wpt != NULL) + route_add_wpt(route, wpt); + return route; + } + + gdb_fread_le(&semilat, sizeof(semilat), 32, prefix1, "semi-latitude"); + gdb_fread_le(&semilon, sizeof(semilon), 32, prefix1, "semi-longitude"); + xlat = GPS_Math_Semi_To_Deg(semilat); + xlon = GPS_Math_Semi_To_Deg(semilon); + + gdb_is_validf(fabs(xlat) <= 90.0, prefix1, "Invalid latitude (%f)", xlat); + + if (gdb_fread_flag(1)) /* altitude flag */ + gdb_fread_le(&xalt, sizeof(xalt), 64, prefix1, "altitude"); + else + xalt = unknown_alt; + + wpt = gdb_create_rte_wpt(xwptname, xlat, xlon, xalt); + if (wpt != NULL) + route_add_wpt(route, wpt); + + while (--isteps > 0) + { + gdb_fread_le(&semilat, sizeof(semilat), 32, prefix2, "semi-latitude"); + gdb_fread_le(&semilon, sizeof(semilon), 32, prefix2, "semi-longitude"); + gdb_fread(buff, 1); /* altitude flag */ + if (buff[0] == 1) + gdb_fread_le(&xalt, sizeof(xalt), 64, prefix2, "altitude"); + + xlat = GPS_Math_Semi_To_Deg(semilat); + xlon = GPS_Math_Semi_To_Deg(semilon); + gdb_is_validf(fabs(xlat) <= 90.0, prefix2, "Invalid latitude (%f)", xlat); + } + + gdb_fread(buff, 1); + gdb_is_valid(buff[0] == 0, prefix1, "\"Zero\" byte expected"); + + gdb_fread_le(&maxlat, sizeof(maxlat), 32, prefix1, "max. latitude"); + gdb_fread_le(&maxlon, sizeof(maxlon), 32, prefix1, "max. longitude"); + + if (gdb_fread_flag(1)) /* link max alt validity + alt */ + gdb_fread(buff, 8); + + gdb_fread_le(&minlat, sizeof(minlat), 32, prefix1, "min. latitude"); + gdb_fread_le(&minlon, sizeof(minlon), 32, prefix1, "min. longitude"); + + if (gdb_fread_flag(1)) /* link min alt validity + alt */ + gdb_fread(buff, 2 * sizeof(int)); + + if (gdb_ver > 1) + gdb_fread(buff, 8); /* unknown 8 bytes since gdb v2 */ + } + + /* This should normally never happen; end of route is handled in main loop before this */ + + fatal(MYNAME "-%s: Unexpected end of route \"%s\"!", prefix1, xname); +} + + +static route_head * +gdb_read_track(const size_t max_file_pos) +{ + char xname[GDB_NAME_BUFFERLEN]; + unsigned char xdisplay; + int xcolour; + int xlat; + int xlon; + int xtime = 0; + double xalt = unknown_alt; + double xdepth = unknown_alt; + double xtemp; + + char buff[128]; + int count; + + route_head *track; + waypoint *wpt; + + const char *prefix0 = "trk_read"; + const char *prefix = "trk_read_loop"; + + gdb_fread_str(xname, sizeof(xname)); + gdb_convert_name_buff(xname, sizeof(xname)); + + gdb_fread_le(&xdisplay, sizeof(xdisplay), 8, prefix0, "display"); + gdb_fread_le(&xcolour, sizeof(xcolour), 32, prefix0, "colour"); + gdb_fread_le(&count, sizeof(count), 32, prefix0, "count"); + + track = route_head_alloc(); + track->rte_name = xstrdup(xname); + track_add_head(track); + + while (count--) + { + gdb_fread_le(&xlat, sizeof(xlat), 32, prefix, "latitude"); + gdb_fread_le(&xlon, sizeof(xlon), 32, prefix, "longitude"); + + gdb_fread(buff, 1); /* altitude flag */ + if (buff[0] == 1) + gdb_fread_le(&xalt, sizeof(xalt), 64, prefix, "altitude"); + + gdb_fread(buff, 1); /* date/time flag */ + if (buff[0] == 1) + gdb_fread_le(&xtime, sizeof(xtime), 32, prefix, "time"); + + gdb_fread(buff, 1); /* depth flag */ + if (buff[0] == 1) + gdb_fread_le(&xdepth, sizeof(xdepth), 64, prefix, "depth"); + + gdb_fread(buff, 1); /* temperature flag */ + if (buff[0] == 1) + gdb_fread_le(&xtemp, sizeof(xtemp), 64, prefix, "temperature"); + + wpt = waypt_new(); + + wpt->latitude = GPS_Math_Semi_To_Deg(xlat); + wpt->longitude = GPS_Math_Semi_To_Deg(xlon); + wpt->creation_time = xtime; + wpt->centiseconds = 0; + wpt->altitude = xalt; + wpt->depth = xdepth; + + gdb_is_validf(fabs(wpt->latitude) <= 90.0, prefix, "Invalid latitude (%f)", wpt->latitude); + + route_add_wpt(track, wpt); + } + + gdb_fread(buff, 1); + + return track; +} + +/*******************************************************************************/ + +static void +gdb_read_data(void) +{ + int reclen, warnings; + char typ; + size_t curpos, anchor; + int wptclass; + + const char *prefix = "main_read_loop"; + + gdb_hidden = route_head_alloc(); + track_add_head(gdb_hidden); + + warnings = 0; + + anchor = ftell(fin); + + /* we go twice through the file to keep sure, all waypoints + are loaded before any route has to be handled */ + + while (feof(fin) == 0) + { + + gdb_fread_le(&reclen, sizeof(reclen), 32, prefix, "record length"); + gdb_is_valid(reclen > 0 && reclen < 0x1F00000, prefix, "record length"); + gdb_fread(&typ, 1); + + curpos = ftell(fin); + + if (typ == 'W') + { + int delta; + waypoint *wpt; + + wpt = gdb_read_wpt(curpos + reclen, &wptclass); + if (wpt != NULL ) + { + if (wptclass == 0) + waypt_add(wpt); + else if (gdb_via == 0) + route_add_wpt(gdb_hidden, wpt); + else + waypt_free(wpt); + } + delta = (int)((curpos + reclen) - ftell(fin)); + if (delta != 0) + { + if ((warnings & 1) == 0) + { + warnings |= 1; + warning(MYNAME "-%s: At least one incomplete waypoint read (%d byte(s) left).\n", prefix, delta); + } + fseek(fin, curpos + reclen, SEEK_SET); + } + continue; + } + else if (typ == 'V') + break; + + fseek(fin, curpos + reclen, SEEK_SET); + } + + clearerr(fin); + fseek(fin, anchor, SEEK_SET); + + while (feof(fin) == 0) + { + gdb_fread_le(&reclen, sizeof(reclen), 32, prefix, "record length"); + gdb_is_valid(reclen > 0 && reclen < 0x1F00000, prefix, "record length"); + gdb_fread(&typ, 1); + + curpos = ftell(fin); + + if ((typ == 'R') || (typ == 'T')) + { + int flag, delta; + + if (typ == 'R') + { + gdb_read_route(); + flag = 2; + } + else + { + gdb_read_track(curpos + reclen); + flag = 4; + } + delta = (int)((curpos + reclen) - ftell(fin)); + if (delta != 0) + { + if ((delta != reclen) && ((warnings & flag) == 0)) + { + warnings |= flag; + warning(MYNAME "-%s: At least one incomplete %s (gdb v%d.0, %d byte(s) left).\n", + prefix, (typ == 'R') ? "route" : "track", gdb_ver, delta); + } + fseek(fin, curpos + reclen, SEEK_SET); + } + } + else + { + if (typ == 'V') break; + + switch(typ) + { + case 'D': break; + case 'L': break; + case 'W': break; + default: warning(MYNAME "-%s: Found unknown record type \"%c\"!\n", prefix, typ); + } + fseek(fin, curpos + reclen, SEEK_SET); + } + } + + /* finally kill our temporary queue */ + track_del_head(gdb_hidden); +} + +/*******************************************************************************/ +/* %%% write support %%% */ +/*******************************************************************************/ + +/* helpers */ + +static waypoint ** +gdb_route_point_list(const route_head *route, int *count) +{ + waypoint **result; + queue *elem, *tmp; + int i = 0; + + QUEUE_FOR_EACH((queue *)&route->waypoint_list, elem, tmp) + { + waypoint *wpt = (waypoint *)elem; + if ((gdb_via == 0) || + (gdb_detect_rtept_class(wpt) == GDB_DEFAULTWPTCLASS)) i++; + } + + *count = i; + if (i == 0) return NULL; + + result = xcalloc(i, sizeof(*result)); + + i = 0; + QUEUE_FOR_EACH((queue *)&route->waypoint_list, elem, tmp) + { + waypoint *wpt = (waypoint *)elem; + if ((gdb_via == 0) || + (gdb_detect_rtept_class(wpt) == GDB_DEFAULTWPTCLASS)) + result[i++] = wpt; + } + + return result; +} + +static void +gdb_fwrite(const void *data, const size_t size) +{ + fwrite(data, size, 1, fout); +} + +static void +gdb_fwrite_str(const char *str, const int len) +{ + + if (len >= 0) + gdb_fwrite(str, len); /* write a string with fixed length */ + else + { + char *tmp = str_utf8_to_cp1252((str != NULL) ? str : ""); + gdb_fwrite(tmp, strlen(tmp) + 1); + xfree(tmp); + } +} + +static void +gdb_fwrite_le(const void *data, const size_t size) +{ + int i; + short s; + char buff[8]; + + switch(size) + { + case 1: + gdb_fwrite(data, 1); + break; + + case 2: /* sizeof(short): */ + s = *(short *)data; + le_write16(&s, s); + gdb_fwrite(&s, 2); + break; + + case 4: /* sizeof(int): */ + i = *(int *)data; + le_write32(&i, i); + gdb_fwrite(&i, 4); + break; + + case 8: /* sizeof(double): */ + le_read64(buff, data); + gdb_fwrite(buff, 8); + break; + + default: + fatal(MYNAME "-write_le: Unsupported data size (%ld)!\n", size); + } +} + +static void +gdb_fwrite_alt(const double alt, const double unknown_value) +{ + char c0 = 0; + char c1 = 1; + + if (alt != unknown_value) /* proximity / depth / altitude */ + { + gdb_fwrite(&c1, 1); + gdb_fwrite_le(&alt, sizeof(alt)); + } + else + gdb_fwrite(&c0, 1); /* no value */ +} + +static void +gdb_fwrite_int(const int data) +{ + gdb_fwrite_le(&data, sizeof(data)); +} + +static void +gdb_fwrite_icon(const waypoint *wpt) /* partly taken from mapsource.c */ +{ + int icon; + char buff[128]; + + if ( /* handle custom icons, which are linked to -2 in garmin_tables.c */ + (wpt->icon_descr != NULL) && + (sscanf(wpt->icon_descr, "%s%d", buff, &icon) == 2) && + (case_ignore_strcmp(buff, "Custom") == 0) && + (icon >= 0) && (icon <= 63) + ) + { + icon += 500; + } + else + { + /* might need to change this to handle version dependent icon handling */ + icon = gdb_find_icon_number_from_desc(wpt->icon_descr, MAPSOURCE); + if (get_cache_icon(wpt) /* && wpt->icon_descr && (strcmp(wpt->icon_descr, "Geocache Found") != 0)*/) + { + icon = gdb_find_icon_number_from_desc(get_cache_icon(wpt), MAPSOURCE); + } + } + gdb_fwrite_le(&icon, sizeof(icon)); +} + +/*******************************************************************************/ +/* %%% write file header %%% */ +/*-----------------------------------------------------------------------------*/ + +static void +gdb_write_file_header(const struct tm *tm) +{ + char buff[128]; + char *c; + int len; + + gdb_fwrite_str("MsRcf", -1); + gdb_fwrite_int(2); + + strncpy(buff, "Dx", sizeof(buff)); + buff[1] = 'k' - 1 + gdb_ver; + gdb_fwrite_str(buff, -1); + +#if 0 + strncpy(buff, "A].SQA*Dec 27 2004*17:40:51", sizeof(buff)); /* MapSource V6.5 */ +#else + /* This is our "Watermark" to show this file was created by GPSbabel */ + /* !!! We should define the date use through Makefile !!! */ + strncpy(buff, "A].GPSBabel_1.2.7-beta*Aug 12 2005*19:55:05", sizeof(buff)); /* gpsbabel V1.2.7 BETA */ +#endif + len = strlen(buff); + buff[2] = 2; + + c = buff; + while ((c = strchr(c, '*'))) *c++ = '\0'; + + gdb_fwrite_int(len); + gdb_fwrite_str(buff, len + 1); + + gdb_fwrite_str("MapSource", -1); /* MapSource magic */ +} + +/*******************************************************************************/ +/* %%% write waypoints %%% */ +/*-----------------------------------------------------------------------------*/ + +static void +gdb_write_waypt(const waypoint *wpt, const int hidden) +{ + int i; + char ffbuf[32], zbuf[32]; + char c0 = 0; + char c1 = 1; + + gdb_is_validf((fabs(wpt->latitude) <= 90), "wpt_write", + "%s: Invalid latitude (%f) detected\n", wpt->shortname, wpt->latitude); + + memset(ffbuf, 0xFF, sizeof(ffbuf)); + memset(zbuf, 0x00, sizeof(zbuf)); + + gdb_fwrite_str(wpt->shortname, -1); + + gdb_fwrite_int( (hidden != 0) ? + GDB_HIDDENROUTEWPTCLASS : GDB_DEFAULTWPTCLASS); /* class */ + gdb_fwrite_str("", -1); /* country */ + + gdb_fwrite(zbuf, 4); /* subclass part 1 */ + gdb_fwrite(ffbuf, 12); /* subclass part 2 */ + gdb_fwrite(zbuf, 2); /* subclass part 3 */ + gdb_fwrite(ffbuf, 4); /* unknown */ + + gdb_fwrite_int(GPS_Math_Deg_To_Semi(wpt->latitude)); + gdb_fwrite_int(GPS_Math_Deg_To_Semi(wpt->longitude)); + + gdb_fwrite_alt(wpt->altitude, unknown_alt); /* altitude */ + + gdb_fwrite_str((wpt->notes != NULL) ? wpt->notes : wpt->description, -1); /* notes/comment/descr */ + +#if 0 + if (garmin_data != NULL) + { + gdb_fwrite_alt(garmin_data->proximity, 0); /* proximity */ + gdb_fwrite_int(garmin_data->display); /* display */ + gdb_fwrite_int(garmin_data->colour); /* colour */ + { + gdb_fwrite(&c0, 1); /* NO proximity */ + gdb_fwrite_int(GDB_DISPLAY_SYMBOL_AND_NAME); /* display */ + gdb_fwrite_int(0); /* colour */ + + } +#else + gdb_fwrite(&c0, 1); /* NO proximity */ + gdb_fwrite_int(GDB_DISPLAY_SYMBOL_AND_NAME); /* display */ + gdb_fwrite_int(0); /* colour */ +#endif + gdb_fwrite_icon(wpt); /* icon */ + gdb_fwrite_str("", -1); /* city */ + gdb_fwrite_str("", -1); /* state */ + gdb_fwrite_str("", -1); /* facility */ + gdb_fwrite(zbuf, 1); /* unknown */ +#if 0 + gdb_fwrite_alt((garmin_data != NULL) ? garmin_data->depth : 0, 0); /* depth */ +#else + gdb_fwrite(&c0, 1); /* NO depth */ +#endif + gdb_fwrite(zbuf, 3); /* three unknown bytes */ + gdb_fwrite(zbuf, 4); /* four unknown bytes */ + + gdb_fwrite_str(wpt->url, -1); /* URL */ + +#if 0 + if (gdb_opt_category != NULL) /* category */ + i = gdb_category; + else + i = (wpt->garmin_data != NULL) ? wpt->garmin_data->category : 0; +#else + i = gdb_category; +#endif + gdb_fwrite_le(&i, 2); + + gdb_fwrite(zbuf, 1); /* temperature flag */ + + if (wpt->creation_time != 0) /* creation time */ + { + gdb_fwrite(&c1, 1); + gdb_fwrite_int(wpt->creation_time); + } + else + gdb_fwrite(&c0, 1); + +} + +static void +gdb_write_waypt_cb(const waypoint *wpt) /* called by waypt_disp over all waypoints */ +{ + int reclen; + size_t pos; + + /* check for duplicate waypoints */ + if (NULL != gdb_find_wpt_q_by_name((queue *)&gdb_hidden->waypoint_list, wpt->shortname)) + return; + + gdb_fwrite_int(0); + gdb_fwrite_str("W", 1); + + pos = ftell(fout); + gdb_write_waypt(wpt, 0); + reclen = ftell(fout) - pos; + + fseek(fout, pos - 5, SEEK_SET); + gdb_fwrite_int(reclen); + + fseek(fout, pos + reclen, SEEK_SET); + + route_add_wpt(gdb_hidden, waypt_dupe(wpt)); /* add tis point to our internal queue */ +} + +static void +gdb_write_rtewpt_cb(const waypoint *wpt) /* called by waypt_disp (route points) */ +{ + int reclen; + size_t pos; + waypoint *tmp; + + tmp = gdb_find_wpt_q_by_name((queue *)&gdb_hidden->waypoint_list, wpt->shortname); + if (tmp == NULL) + { + tmp = find_waypt_by_name(wpt->shortname); + + gdb_fwrite_int(0); + gdb_fwrite_str("W", 1); + + pos = ftell(fout); + gdb_write_waypt(wpt, (tmp == NULL)); + reclen = ftell(fout) - pos; + + fseek(fout, pos - 5, SEEK_SET); + gdb_fwrite_int(reclen); + + fseek(fout, pos + reclen, SEEK_SET); + + route_add_wpt(gdb_hidden, waypt_dupe(wpt)); /* add tis point to our internal queue */ + } +} + +/*******************************************************************************/ +/* %%% write routes %%% */ +/*-----------------------------------------------------------------------------*/ + +static void +gdb_write_route(const route_head *route, const waypoint **list, const int count) +{ + int i, wpt_class; + char buff[128], zbuff[32], ffbuff[32]; + waypoint *prev = NULL; + const char c0 = 0; + const char c1 = 1; + const char c3 = 3; + double maxlat = -90; + double minlat = +90; + double maxlon = -180; + double minlon = +180; + double maxalt = -unknown_alt; + double minalt = +unknown_alt; + + memset(zbuff, 0, sizeof(zbuff)); + memset(ffbuff, 0xFF, sizeof(ffbuff)); + + for (i = 0; i < count; i++) + { + const waypoint *wpt = list[i]; + + if (wpt->latitude > maxlat) maxlat = wpt->latitude; + if (wpt->latitude < minlat) minlat = wpt->latitude; + if (wpt->longitude > maxlon) maxlon = wpt->longitude; + if (wpt->longitude < minlon) minlon = wpt->longitude; + if (wpt->altitude != unknown_alt) + { + if (wpt->altitude > maxalt) maxalt = wpt->altitude; + if (wpt->altitude < minalt) minalt = wpt->altitude; + } + } + + if (route->rte_name == NULL) + { + snprintf(buff, sizeof(buff), "Route%04d", route->rte_num); + gdb_fwrite_str(buff, -1); + } + else + gdb_fwrite_str(route->rte_name, -1); + + gdb_fwrite(&c0, 1); /* auto_name */ + + if (count == 1) gdb_fwrite(&c1, 1); /* skip max data */ + else + { + gdb_fwrite(&c0, 1); /* ??? */ + gdb_fwrite_int(GPS_Math_Deg_To_Semi(maxlat)); /* maximum latitude over route */ + gdb_fwrite_int(GPS_Math_Deg_To_Semi(maxlon)); /* maximum longitude over route */ + gdb_fwrite_alt(maxalt, unknown_alt); /* maximum altitude over route */ + + gdb_fwrite_int(GPS_Math_Deg_To_Semi(minlat)); /* minimum latitude over route */ + gdb_fwrite_int(GPS_Math_Deg_To_Semi(minlon)); /* minimum longitude over route */ + gdb_fwrite_alt(minalt, -unknown_alt); /* minimum altitude over route */ + } + + gdb_fwrite_int(count); /* number of points in route */ + + for (i = 0; i < count; i++) + { + const waypoint *wpt = list[i]; + + wpt_class = gdb_detect_rtept_class(wpt); + + if (prev != NULL) + { + gdb_fwrite_int(2); /* route link details */ + + gdb_fwrite_int(GPS_Math_Deg_To_Semi(prev->latitude)); /* ilink step 1 (end point 1) */ + gdb_fwrite_int(GPS_Math_Deg_To_Semi(prev->longitude)); + gdb_fwrite_alt(prev->altitude, unknown_alt); + + gdb_fwrite_int(GPS_Math_Deg_To_Semi(wpt->latitude)); /* ilink step 2 (end point 2) */ + gdb_fwrite_int(GPS_Math_Deg_To_Semi(wpt->longitude)); + gdb_fwrite_alt(wpt->altitude, unknown_alt); + + if (wpt->latitude > prev->latitude) /* get maximum lat, lon and alt */ + { + maxlat = wpt->latitude; + minlat = prev->latitude; + } + else + { + maxlat = prev->latitude; + minlat = wpt->latitude; + } + if (wpt->longitude > prev->longitude) + { + maxlon = wpt->longitude; + minlon = prev->longitude; + } + else + { + maxlon = prev->longitude; + minlon = wpt->longitude; + } + if (wpt->altitude != unknown_alt) + { + maxalt = wpt->altitude; + minalt = wpt->altitude; + } + else + { + maxalt = -unknown_alt; + minalt = +unknown_alt; + } + if (prev->altitude != unknown_alt) + { + if (prev->altitude > maxalt) maxalt = prev->altitude; + if (prev->altitude < minalt) minalt = prev->altitude; + } + + gdb_fwrite(&c0, 1); /* ??? */ + + gdb_fwrite_int(GPS_Math_Deg_To_Semi(maxlat)); /* maximum coords & altitude */ + gdb_fwrite_int(GPS_Math_Deg_To_Semi(maxlon)); + gdb_fwrite_alt(maxalt, unknown_alt); + + gdb_fwrite_int(GPS_Math_Deg_To_Semi(minlat)); /* minimum coords & altitude */ + gdb_fwrite_int(GPS_Math_Deg_To_Semi(minlon)); + gdb_fwrite_alt(minalt, -unknown_alt); + + if (gdb_ver > 1) + gdb_fwrite(ffbuff, 8); + } + + gdb_fwrite_str(wpt->shortname, -1); /* short name */ + + gdb_fwrite_int(wpt_class); /* class */ + gdb_fwrite_str("", -1); /* country */ + + gdb_fwrite(zbuff, 4); /* subclass part 1 */ + gdb_fwrite(ffbuff, 12); /* subclass part 2 */ + gdb_fwrite(zbuff, 2); /* subclass part 3 */ + gdb_fwrite(ffbuff, 4); /* unknown */ + + gdb_fwrite(&c0, 1); /* unknown value or string */ + gdb_fwrite(&c3, 1); /* unknown 18 bytes starting with 0x03 */ + gdb_fwrite(zbuff, 3); + gdb_fwrite(ffbuff, 4); + gdb_fwrite(zbuff, 10); + + prev = (waypoint *)wpt; + } + + gdb_fwrite_int(0); /* Zero interlink steps */ + gdb_fwrite(&c1, 1); + + if (gdb_ver > 1) + gdb_fwrite(ffbuff, 8); + + gdb_fwrite(&c0, 1); +} + +static void +gdb_write_route_cb(const route_head *route) +{ + int reclen; + size_t pos; + int count; + waypoint **list; + + list = gdb_route_point_list(route, &count); + if (count == 0) return; /* don't write empty routes */ + + gdb_fwrite_int(0); + gdb_fwrite_str("R", 1); + + pos = ftell(fout); + gdb_write_route(route, (const waypoint**)list, count); + reclen = ftell(fout) - pos; + + fseek(fout, pos - 5, SEEK_SET); + gdb_fwrite_int(reclen); + + fseek(fout, pos + reclen, SEEK_SET); + + xfree(list); +} + +/*******************************************************************************/ +/* %%% write tracks %%% */ +/*-----------------------------------------------------------------------------*/ + +static void +gdb_write_track(const route_head *track) +{ + char buff[128]; + const char c0 = 0; + const char c1 = 1; + queue *elem, *tmp; + int count = track->rte_waypt_ct; + + if (track->rte_name == NULL) + snprintf(buff, sizeof(buff), "Track%04d", track->rte_num); + else + strncpy(buff, track->rte_name, sizeof(buff)); + + gdb_fwrite_str(buff, -1); + gdb_fwrite(&c0, 1); /* display */ + gdb_fwrite_int(0); /* xcolour */ + gdb_fwrite_int(count); + + QUEUE_FOR_EACH((queue *)&track->waypoint_list, elem, tmp) + { + waypoint *wpt = (waypoint *)elem; + + gdb_fwrite_int(GPS_Math_Deg_To_Semi(wpt->latitude)); + gdb_fwrite_int(GPS_Math_Deg_To_Semi(wpt->longitude)); + gdb_fwrite_alt(wpt->altitude, unknown_alt); /* altitude */ + + + if (wpt->creation_time != 0) /* creation time */ + { + gdb_fwrite(&c1, 1); + gdb_fwrite_int(wpt->creation_time); + } + else + gdb_fwrite(&c0, 1); + + gdb_fwrite_alt(wpt->depth, unknown_alt); /* depth */ + gdb_fwrite(&c0, 1); /* temperature */ + } + gdb_fwrite(&c0, 1); +} + +static void +gdb_write_track_cb(const route_head *track) /* called from track_disp_all */ +{ + int reclen; + size_t pos; + + if (track->rte_waypt_ct <= 0) return; /* don't write empty tracks */ + + gdb_fwrite_int(0); + gdb_fwrite_str("T", 1); + + pos = ftell(fout); + + gdb_write_track(track); + + reclen = ftell(fout) - pos; + fseek(fout, pos - 5, SEEK_SET); + gdb_fwrite_int(reclen); + + fseek(fout, pos + reclen, SEEK_SET); +} + +/*******************************************************************************/ + +static void +gdb_write_data(void) +{ + char c1 = 1; + + gdb_hidden = route_head_alloc(); /* contains all written waypts & rtepts */ + track_add_head(gdb_hidden); /* tracks comes later and we drop this before */ + + if (doing_wpts) waypt_disp_all(gdb_write_waypt_cb); + if (doing_rtes) + { + + if (gdb_via == 0) + { + /* find out all route points we have to write as a "HIDDEN CLASS" waypoint */ + route_disp_all(NULL, NULL, gdb_write_rtewpt_cb); + } + route_disp_all(gdb_write_route_cb, NULL, NULL); + } + + track_del_head(gdb_hidden); /* vaporize our temporary queue */ + + if (doing_trks) track_disp_all(gdb_write_track_cb, NULL, NULL); + + gdb_fwrite_int(2); /* finalize gdb with empty map segment */ + gdb_fwrite_str("V", -1); + gdb_fwrite(&c1, 1); +} + +/*******************************************************************************/ + +static void +gdb_init_opts(const char op) /* 1 = read; 2 = write */ +{ + gdb_via = 0; + gdb_category = 0; + gdb_ver = 2; + + if (gdb_opt_via != NULL) /* opt_via present in both ops */ + { + if ((case_ignore_strcmp(gdb_opt_via, GDB_OPT_VIA) == 0) || + (*gdb_opt_via == '\0')) + gdb_via = 1; + else + gdb_via = atoi(gdb_opt_via); + } + + if (op & 2) /* writer opts */ + { + if ((gdb_opt_category != NULL) && + (case_ignore_strcmp(gdb_opt_category, GDB_OPT_CATEGORY) != 0) && + (*gdb_opt_category != '\0')) + { + gdb_category = atoi(gdb_opt_category); + if ((gdb_category < 1) || (gdb_category > 16)) + fatal(MYNAME ": Unsupported category \"%s\"!\n", gdb_opt_category); + gdb_category = 1 << --gdb_category; + } + + gdb_ver = atoi(gdb_opt_ver); + if ((gdb_ver < GDB_VER_MIN) || (gdb_ver > GDB_VER_MAX)) + fatal(MYNAME ": Unsupported version \"%s\"!\n", gdb_opt_ver); + } +} + +/*******************************************************************************/ +/* %%% global cb's %%% */ +/*******************************************************************************/ + +static void +gdb_rd_init(const char *fname) +{ + gdb_init_opts(1); + + fin_name = xstrdup(fname); + fin = xfopen(fname, "rb", MYNAME); +} + +static void +gdb_wr_init(const char *fname) +{ + gdb_init_opts(2); + + fout_name = xstrdup(fname); + fout = xfopen(fname, "wb", MYNAME); +} + +static void +gdb_rd_deinit(void) +{ + fclose(fin); + xfree(fin_name); + fin_name = NULL; +} + +static void +gdb_wr_deinit(void) +{ + fclose(fout); + xfree(fout_name); + fout_name = NULL; +} + +static void +gdb_read(void) +{ + gdb_read_file_header(); + gdb_read_data(); +} + +static void +gdb_write(void) +{ + gdb_write_file_header(NULL); + gdb_write_data(); +} + +/*******************************************************************************/ + +ff_vecs_t gdb_vecs = { + ff_type_file, + FF_CAP_RW_ALL, + gdb_rd_init, + gdb_wr_init, + gdb_rd_deinit, + gdb_wr_deinit, + gdb_read, + gdb_write, + NULL, + gdb_args +}; + +/*******************************************************************************/ diff --git a/geo.c b/geo.c index c8ace7244..11cd0f72d 100644 --- a/geo.c +++ b/geo.c @@ -133,7 +133,7 @@ void wpt_coord(const char *args, const char **attrv) void geo_rd_init(const char *fname) { - xml_init(fname, loc_map); + xml_init(fname, loc_map, NULL); } void diff --git a/geoniche.c b/geoniche.c index 7fb0d4a7d..b0c85be65 100644 --- a/geoniche.c +++ b/geoniche.c @@ -193,7 +193,7 @@ data_read(void) /* Process record 0 */ pdb_rec = pdb->rec_index.rec; - if (strcmp(pdb_rec->data, Rec0Magic)) + if (strcmp((char *) pdb_rec->data, Rec0Magic)) fatal(MYNAME ": Bad record 0, not a GeoNiche file.\n"); pdb_rec = pdb_rec->next; @@ -214,7 +214,7 @@ data_read(void) int icon; char *notes; char gid[6+1]; - struct tm tm; + struct tm tm = {0}; wpt = waypt_new(); if (!wpt) @@ -408,7 +408,7 @@ copilot_writewpt(const waypoint *wpt) struct pdb_record *opdb_rec; int vlen; static int vsize = 4096; - char *vdata; + ubyte *vdata; char *title; struct tm tm; char datestr[10+1]; @@ -418,7 +418,7 @@ copilot_writewpt(const waypoint *wpt) if (ct == 0) { - opdb_rec = new_Record (0, 0, ct++, sizeof(Rec0Magic), Rec0Magic); + opdb_rec = new_Record (0, 0, ct++, sizeof(Rec0Magic), (ubyte *) Rec0Magic); if (opdb_rec == NULL) fatal(MYNAME ": libpdb couldn't create record\n"); if (pdb_AppendRecord(PdbOut, opdb_rec)) @@ -444,13 +444,13 @@ copilot_writewpt(const waypoint *wpt) else notes = enscape(wpt->notes); - vdata = (char *) xmalloc(vsize); + vdata = (ubyte *) xmalloc(vsize); if (vdata == NULL) fatal(MYNAME ": libpdb couldn't get record memory\n"); for (;;) { - vlen = snprintf(vdata, vsize, + vlen = snprintf((char *) vdata, vsize, "Target,%d,%s,,%s,%f,%f,%f,%s,%s,,,,%d,,,,%s" , id , title @@ -479,7 +479,7 @@ copilot_writewpt(const waypoint *wpt) vsize = vlen + 1; else vsize *= 2; - vdata = (char *) xrealloc(vdata, vsize); + vdata = (ubyte *) xrealloc(vdata, vsize); if (vdata == NULL) fatal(MYNAME ": libpdb couldn't get record memory\n"); } diff --git a/glogbook.c b/glogbook.c index 3fe98162d..8b15a6856 100644 --- a/glogbook.c +++ b/glogbook.c @@ -57,7 +57,7 @@ static xg_tag_mapping gl_map[] = { void glogbook_rd_init(const char *fname) { - xml_init(fname, gl_map); + xml_init(fname, gl_map, NULL); } void @@ -87,37 +87,39 @@ glogbook_wr_deinit(void) static void glogbook_waypt_pr(const waypoint *wpt) { - fprintf(ofd, "\n"); - fprintf(ofd, "\t\n"); - fprintf(ofd, "\t%f\n", wpt->latitude); - fprintf(ofd, "\t%f\n", wpt->longitude); + fprintf(ofd, " \n"); + fprintf(ofd, " \n"); + fprintf(ofd, " %.5f\n", wpt->latitude); + fprintf(ofd, " %.5f\n", wpt->longitude); if (wpt->altitude != unknown_alt) { - fprintf(ofd, "\t%f\n", wpt->altitude); + fprintf(ofd, " %.3f\n", wpt->altitude); } + fprintf(ofd, " \n"); + fprintf(ofd, " "); xml_write_time(ofd, wpt->creation_time, "Time"); - fprintf(ofd, "\t\n"); - fprintf(ofd, "\n"); + fprintf(ofd, " \n"); } void glogbook_hdr( const route_head *rte) { - fprintf(ofd, "\n"); + fprintf(ofd, " \n"); } void glogbook_ftr(const route_head *rte) { - fprintf(ofd, "\n"); + fprintf(ofd, " \n"); } void glogbook_write(void) { + fprintf(ofd, "\n"); fprintf(ofd, "\n"); - fprintf(ofd, "\n"); + fprintf(ofd, " \n"); track_disp_all(glogbook_hdr, glogbook_ftr, glogbook_waypt_pr); - fprintf(ofd, "\n"); + fprintf(ofd, " \n"); fprintf(ofd, "\n"); } diff --git a/google.c b/google.c index 200f3d215..ab09b35cc 100644 --- a/google.c +++ b/google.c @@ -124,6 +124,8 @@ void goog_poly_e( const char *args, const char **unused ) long lat = 0; long lon = 0; long level = 0; + long level1 = -9999; + long level2 = -9999; char *str = encoded_points; char *lstr = encoded_levels; @@ -135,12 +137,22 @@ void goog_poly_e( const char *args, const char **unused ) lat += decode_goog64( &str ); lon += decode_goog64( &str ); - level = 0; + level = -1; + level2 = level1; if ( lstr && *lstr ) { - level = decode_goog64( &lstr ); - } - + level1 = -decode_goog64( &lstr ); + } + else + { + level1 = -9999; + } + level = (level1latitude = lat / 100000.0; @@ -167,7 +179,7 @@ void goog_poly_e( const char *args, const char **unused ) void google_rd_init(const char *fname) { - xml_init(fname, google_map); + xml_init(fname, google_map, "ISO-8859-1" ); } void @@ -184,7 +196,7 @@ google_read(void) if ( end ) { *end = '\0'; xml_deinit(); - xml_init( NULL, google_map ); + xml_init( NULL, google_map, NULL ); xml_readstring( xml ); } } diff --git a/gpsutil.c b/gpsutil.c index ae648d093..983f6649b 100644 --- a/gpsutil.c +++ b/gpsutil.c @@ -57,7 +57,7 @@ static void data_read(void) { char ibuf[100]; - char name[9], desc[30]; + char name[9], desc[31]; double lat,lon; char latdir, londir; int ilat, ilon; @@ -124,7 +124,8 @@ gpsutil_disp(const waypoint *wpt) lat < 0.0 ? 'S' : 'N', fabs(lon), lon < 0.0 ? 'W' : 'E', - wpt->altitude == unknown_alt ? 0 : wpt->altitude, + ((wpt->altitude == unknown_alt) || + (wpt->altitude < 0.0)) ? 0 : wpt->altitude, 'm', wpt->description ? tdesc : "", icon_token); diff --git a/gpx.c b/gpx.c index 73ef4596e..f11401bfd 100644 --- a/gpx.c +++ b/gpx.c @@ -58,6 +58,7 @@ static char *urlbase = NULL; static route_head *trk_head; static route_head *rte_head; + #define MYNAME "GPX" #define MY_CBUF 4096 #define DEFAULT_XSI_SCHEMA_LOC "http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd" @@ -70,8 +71,8 @@ static route_head *rte_head; */ /* #define FLT_FMT "%.9lf" */ /* ExpertGPS */ #define FLT_FMT "%0.9lf" -#define FLT_FMT_T "%lf" -#define FLT_FMT_R "%lf" +#define FLT_FMT_T "%0.9lf" +#define FLT_FMT_R "%0.9lf" typedef enum { tt_unknown = 0, @@ -92,6 +93,11 @@ typedef enum { tt_wpt_urlname, tt_wpt_link, /* New in GPX 1.1 */ tt_wpt_link_text, /* New in GPX 1.1 */ + tt_pdop, /* PDOPS are common for all three */ + tt_hdop, /* PDOPS are common for all three */ + tt_vdop, /* PDOPS are common for all three */ + tt_fix, + tt_sat, tt_cache, tt_cache_name, tt_cache_container, @@ -133,6 +139,8 @@ typedef enum { tt_trk_trkseg_trkpt_desc, tt_trk_trkseg_trkpt_ele, tt_trk_trkseg_trkpt_time, + tt_trk_trkseg_trkpt_course, + tt_trk_trkseg_trkpt_speed, } tag_type; typedef struct tag_mapping { @@ -209,6 +217,25 @@ tag_mapping tag_path_map[] = { { tt_trk_trkseg_trkpt_url, 0, "/gpx/trk/trkseg/trkpt/url" }, { tt_trk_trkseg_trkpt_urlname, 0, "/gpx/trk/trkseg/trkpt/urlname" }, { tt_trk_trkseg_trkpt_sym, 0, "/gpx/trk/trkseg/trkpt/sym" }, + { tt_trk_trkseg_trkpt_course, 0, "/gpx/trk/trkseg/trkpt/course" }, + { tt_trk_trkseg_trkpt_speed, 0, "/gpx/trk/trkseg/trkpt/speed" }, + + /* Common to tracks, routes, and waypts */ + { tt_fix, 0, "/gpx/wpt/fix" }, + { tt_fix, 0, "/gpx/trk/trkseg/trkpt/fix" }, + { tt_fix, 0, "/gpx/rte/rtept/fix" }, + { tt_sat, 0, "/gpx/wpt/sat" }, + { tt_sat, 0, "/gpx/trk/trkseg/trkpt/sat" }, + { tt_sat, 0, "/gpx/rte/rtept/sat" }, + { tt_pdop, 0, "/gpx/wpt/pdop" }, + { tt_pdop, 0, "/gpx/trk/trkseg/trkpt/pdop" }, + { tt_pdop, 0, "/gpx/rte/rtept/pdop" }, + { tt_hdop, 0, "/gpx/wpt/hdop" }, + { tt_hdop, 0, "/gpx/trk/trkseg/trkpt/hdop" }, + { tt_hdop, 0, "/gpx/rte/rtept/hdop" }, + { tt_vdop, 0, "/gpx/wpt/vdop" }, + { tt_vdop, 0, "/gpx/trk/trkseg/trkpt/vdop" }, + { tt_vdop, 0, "/gpx/rte/rtept/hdop" }, {0} }; @@ -303,6 +330,7 @@ start_something_else(const char *el, const char **attrv) char **avcp = NULL; int attr_count = 0; xml_tag *new_tag; + fs_xml *fs_gpx = NULL; if ( !wpt_tmp ) { return; @@ -343,8 +371,10 @@ start_something_else(const char *el, const char **attrv) } } else { - if ( wpt_tmp->gpx_extras ) { - cur_tag = wpt_tmp->gpx_extras; + fs_gpx = (fs_xml *)fs_chain_find( wpt_tmp->fs, FS_GPX ); + + if ( fs_gpx && fs_gpx->tag ) { + cur_tag = fs_gpx->tag; while ( cur_tag->sibling ) { cur_tag = cur_tag->sibling; } @@ -352,7 +382,9 @@ start_something_else(const char *el, const char **attrv) new_tag->parent = NULL; } else { - wpt_tmp->gpx_extras = new_tag; + fs_gpx = fs_xml_alloc(FS_GPX); + fs_gpx->tag = new_tag; + fs_chain_add( &(wpt_tmp->fs), (format_specific_data *)fs_gpx ); new_tag->parent = NULL; } } @@ -614,8 +646,7 @@ xml_parse_time( const char *cdatastr ) tm.tm_year -= 1900; tm.tm_isdst = 0; - rv = mktime(&tm) + get_tz_offset() - off_sign*off_hr*3600 - - off_sign*off_min*60; + rv = mkgmtime(&tm) - off_sign*off_hr*3600 - off_sign*off_min*60; xfree(timestr); @@ -758,6 +789,12 @@ gpx_end(void *data, const char *el) case tt_trk_number: trk_head->rte_num = atoi(cdatastrp); break; + case tt_trk_trkseg_trkpt_course: + wpt_tmp->course = atof(cdatastrp); + break; + case tt_trk_trkseg_trkpt_speed: + wpt_tmp->speed = atof(cdatastrp); + break; /* * Items that are actually in multiple categories. @@ -793,6 +830,31 @@ gpx_end(void *data, const char *el) case tt_rte_rtept_desc: wpt_tmp->notes = xstrdup(cdatastrp); break; + case tt_pdop: + wpt_tmp->pdop = atof(cdatastrp); + break; + case tt_hdop: + wpt_tmp->hdop = atof(cdatastrp); + break; + case tt_vdop: + wpt_tmp->vdop = atof(cdatastrp); + break; + case tt_sat: + wpt_tmp->sat = atof(cdatastrp); + break; + case tt_fix: + wpt_tmp->fix = atoi(cdatastrp)-1; + if ( wpt_tmp->fix < fix_2d) { + if (!case_ignore_strcmp(cdatastrp, "none")) + wpt_tmp->fix = fix_none; + else if (!case_ignore_strcmp(cdatastrp, "dgps")) + wpt_tmp->fix = fix_dgps; + else if (!case_ignore_strcmp(cdatastrp, "pps")) + wpt_tmp->fix = fix_pps; + else + wpt_tmp->fix = fix_unknown; + } + break; case tt_unknown: end_something_else(); *s = 0; @@ -1140,11 +1202,79 @@ write_gpx_url(const waypoint *waypointp) } } +/* + * Write optional accuracy information for a given (way|track|route)point + * to the output stream. Done in one place since it's common for all three. + * Order counts. + */ +static void +gpx_write_common_acc(const waypoint *waypointp, const char *indent) +{ + char *fix = NULL; + + switch (waypointp->fix) { + case fix_2d: + fix = "2d"; + break; + case fix_3d: + fix = "3d"; + break; + case fix_dgps: + fix = "dgps"; + break; + case fix_pps: + fix = "pps"; + break; + } + if (fix) { + fprintf(ofd, "%s%s\n", indent, fix); + } + if (waypointp->sat > 0) { + fprintf(ofd, "%s%d\n", indent, waypointp->sat); + } + if (waypointp->hdop) { + fprintf(ofd, "%s%f\n", indent, waypointp->hdop); + } + if (waypointp->vdop) { + fprintf(ofd, "%s%f\n", indent, waypointp->vdop); + } + if (waypointp->pdop) { + fprintf(ofd, "%s%f\n", indent, waypointp->pdop); + } +} + +static void +gpx_write_common_position(const waypoint *waypointp, const char *indent) +{ + if (waypointp->altitude != unknown_alt) { + fprintf(ofd, "%s%f\n", + indent, waypointp->altitude); + } + if (waypointp->creation_time) { + xml_write_time(ofd, waypointp->creation_time, "time"); + } +} + +static void +gpx_write_common_description(const waypoint *waypointp, const char *indent, + const char *oname) +{ + write_optional_xml_entity(ofd, indent, "name", oname); + write_optional_xml_entity(ofd, indent, "cmt", waypointp->description); + if (waypointp->notes && waypointp->notes[0]) + write_xml_entity(ofd, indent, "desc", waypointp->notes); + else + write_optional_xml_entity(ofd, indent, "desc", waypointp->description); + write_gpx_url(waypointp); + write_optional_xml_entity(ofd, indent , "sym", waypointp->icon_descr); +} + static void gpx_waypt_pr(const waypoint *waypointp) { const char *oname; char *odesc; + fs_xml *fs_gpx = NULL; /* * Desparation time, try very hard to get a good shortname @@ -1164,24 +1294,15 @@ gpx_waypt_pr(const waypoint *waypointp) fprintf(ofd, "\n", waypointp->latitude, waypointp->longitude); - if (waypointp->altitude != unknown_alt) { - fprintf(ofd, " %f\n", - waypointp->altitude); - } - if (waypointp->creation_time) { - xml_write_time(ofd, waypointp->creation_time, "time"); - } - write_optional_xml_entity(ofd, " ", "name", oname); - write_optional_xml_entity(ofd, " ", "cmt", waypointp->description); - if (waypointp->notes && waypointp->notes[0]) - write_xml_entity(ofd, " ", "desc", waypointp->notes); - else - write_optional_xml_entity(ofd, " ", "desc", waypointp->description); - write_gpx_url(waypointp); - write_optional_xml_entity(ofd, " ", "sym", waypointp->icon_descr); + gpx_write_common_position(waypointp, " "); + gpx_write_common_description(waypointp, " ", oname); + gpx_write_common_acc(waypointp, " "); - fprint_xml_chain( waypointp->gpx_extras, waypointp ); + fs_gpx = (fs_xml *)fs_chain_find( waypointp->fs, FS_GPX ); + if ( fs_gpx ) { + fprint_xml_chain( fs_gpx->tag, waypointp ); + } fprintf(ofd, "\n"); } @@ -1203,24 +1324,29 @@ gpx_track_disp(const waypoint *waypointp) fprintf(ofd, "\n", waypointp->latitude, waypointp->longitude); - if (waypointp->altitude != unknown_alt) { - fprintf(ofd, " %f\n", - waypointp->altitude); - } - if (waypointp->creation_time) { - xml_write_time(ofd, waypointp->creation_time,"time"); + + gpx_write_common_position(waypointp, " "); + + /* These were accidentally removed from 1.1 */ + if (gpx_wversion_num == 10) { + if (waypointp->course >= 0) { + fprintf(ofd, " %f\n", + waypointp->course); + } + if (waypointp->speed >= 0) { + fprintf(ofd, " %f\n", + waypointp->speed); + } } /* GPX doesn't require a name on output, so if we made one up * on input, we might as well say nothing. */ - if (!waypointp->wpt_flags.shortname_is_synthetic) { - write_optional_xml_entity(ofd, " ", "name", - waypointp->shortname); - } - write_optional_xml_entity(ofd, " ", "desc", waypointp->notes); - write_gpx_url(waypointp); - write_optional_xml_entity(ofd, " ", "sym", waypointp->icon_descr); + gpx_write_common_description(waypointp, " ", + waypointp->wpt_flags.shortname_is_synthetic ? + NULL : waypointp->shortname); + gpx_write_common_acc(waypointp, " "); + fprintf(ofd, "\n"); } @@ -1255,17 +1381,9 @@ gpx_route_disp(const waypoint *waypointp) waypointp->latitude, waypointp->longitude); - if (waypointp->altitude != unknown_alt) { - fprintf(ofd, " %f\n", - waypointp->altitude); - } - if (waypointp->creation_time) { - xml_write_time(ofd, waypointp->creation_time,"time"); - } - write_optional_xml_entity(ofd, " ", "name", waypointp->shortname); - write_optional_xml_entity(ofd, " ", "cmt", waypointp->description); - write_optional_xml_entity(ofd, " ", "desc", waypointp->notes); - write_optional_xml_entity(ofd, " ", "sym", waypointp->icon_descr); + gpx_write_common_position(waypointp, " "); + gpx_write_common_description(waypointp, " ", waypointp->shortname); + gpx_write_common_acc(waypointp, " "); fprintf(ofd, " \n"); } diff --git a/hiketech.c b/hiketech.c index a1d026485..4daa056bd 100644 --- a/hiketech.c +++ b/hiketech.c @@ -73,10 +73,10 @@ static xg_tag_mapping ht_map[] = { { NULL, 0, NULL} }; -void +static void hiketech_rd_init(const char *fname) { - xml_init(fname, ht_map); + xml_init(fname, ht_map, NULL); } void @@ -115,7 +115,7 @@ hiketech_trk_tlr(const route_head *rte) fprintf(ofd, "\n"); } -void +static void hiketech_print_utc(time_t tm, const char *indent, const char *tag) { char tbuf[80]; @@ -156,7 +156,7 @@ hiketech_waypt_pr(const waypoint *wpt) fprintf(ofd, "\n"); } -void +static void hiketech_write(void) { fprintf(ofd, "\n"); @@ -168,69 +168,82 @@ hiketech_write(void) fprintf(ofd, "\n"); } +static void ht_wpt_s(const char *args, const char **unused) { wpt_tmp = waypt_new(); } +static void ht_ident(const char *args, const char **unused) { wpt_tmp->shortname = xstrdup(args); } +static void ht_sym(const char *args, const char **unused) { wpt_tmp->icon_descr = xstrdup(args); wpt_tmp->wpt_flags.icon_descr_is_dynamic = 1; } +static void ht_lat(const char *args, const char **unused) { wpt_tmp->latitude = atof(args); } +static void ht_long(const char *args, const char **unused) { wpt_tmp->longitude = atof(args); } +static void ht_alt(const char *args, const char **unused) { wpt_tmp->altitude = atof(args); } +static void ht_wpt_e(const char *args, const char **unused) { waypt_add(wpt_tmp); wpt_tmp = NULL; } +static void ht_trk_s(const char *args, const char **unused) { trk_head = route_head_alloc(); track_add_head(trk_head); } +static void ht_trk_e(const char *args, const char **unused) { } +static void ht_trk_ident(const char *args, const char **unused) { trk_head->rte_name = xstrdup(args); } +static void ht_trk_pnt_s(const char *args, const char **unused) { wpt_tmp = waypt_new(); } +static void ht_trk_pnt_e(const char *args, const char **unused) { route_add_wpt(trk_head, wpt_tmp); } +static void ht_trk_utc(const char *args, const char **unused) { struct tm tm; @@ -244,21 +257,24 @@ void ht_trk_utc(const char *args, const char **unused) tm.tm_year -= 1900; tm.tm_isdst = 0; - utc = mktime(&tm) + get_tz_offset() ; + utc = mkgmtime(&tm); wpt_tmp->creation_time = utc; } +static void ht_trk_lat(const char *args, const char **unused) { wpt_tmp->latitude = atof(args); } +static void ht_trk_long(const char *args, const char **unused) { wpt_tmp->longitude = atof(args); } +static void ht_trk_alt(const char *args, const char **unused) { wpt_tmp->altitude = atof(args); diff --git a/hsa_ndv.c b/hsa_ndv.c index d52452048..9fb6a73a7 100644 --- a/hsa_ndv.c +++ b/hsa_ndv.c @@ -377,9 +377,9 @@ void readVersion4( FILE* pFile) { while( TRUE ) { - char recData[256]; + char recData[256] = {0}; // get the position - double lat2, lng2; + double lat2, lng2 = 0; // set the pointer to the time stamp depending // on whether we have a sounding array or not @@ -388,12 +388,12 @@ void readVersion4( FILE* pFile) long* pts2 = 0; int soundArray = FALSE; - int numberOfVerticies; + int numberOfVerticies = 0; char className[256]; char attr[1024]; int Vertex; - memset(attr, 0, 1024); + memset(attr, 0, sizeof(attr)); wpt_tmp = xcalloc(sizeof(*wpt_tmp), 1); wpt_tmp->altitude = unknown_alt; @@ -521,7 +521,8 @@ int readPositionRecord( FILE* pFile, double* lat, double* lng, long* timeStamp) { // read the lat record - char recData[256]; + char recData[256] = {0}; + if( !readRecord( pFile, EF_LAT_REC, recData) ) // no lat record then finished return FALSE; diff --git a/html.c b/html.c index ab72d1c49..7fc724705 100644 --- a/html.c +++ b/html.c @@ -69,6 +69,7 @@ html_disp(const waypoint *wpt) int32 utmz; double utme, utmn; char utmzc; + fs_xml *fs_gpx = NULL; lonint = abs((int) wpt->longitude); latint = abs((int) wpt->latitude); @@ -126,8 +127,14 @@ html_disp(const waypoint *wpt) else if (wpt->notes && (!wpt->description || strcmp(wpt->notes,wpt->description))) { fprintf (file_out, "

%s

\n", wpt->notes); } - if ( includelogs && wpt->gpx_extras ) { - xml_tag *root = wpt->gpx_extras; + + fs_gpx = NULL; + if ( includelogs ) { + fs_gpx = (fs_xml *)fs_chain_find( wpt->fs, FS_GPX); + } + + if ( fs_gpx && fs_gpx->tag ) { + xml_tag *root = fs_gpx->tag; xml_tag *curlog = NULL; xml_tag *logpart = NULL; curlog = xml_findfirst( root, "groundspeak:log" ); diff --git a/igc.c b/igc.c index 188e7d378..95c7d41ac 100644 --- a/igc.c +++ b/igc.c @@ -101,7 +101,7 @@ static igc_rec_type_t get_record(char *rec) } } len = strlen(rec); - if (len < 3 || rec[len - 2] != '\r' || rec[len - 1] != '\n' || rec[0] < 'A' || rec[0] > 'Z') { + if (len < 3 || rec[0] < 'A' || rec[0] > 'Z') { warning(MYNAME " bad input record: '%s'\n", rec); return rec_bad; } @@ -165,7 +165,7 @@ static void igc_task_rec(const char *rec) tm.tm_year += 100; } tm.tm_isdst = 0; - creation = mktime(&tm) + get_tz_offset(); + creation = mkgmtime(&tm); // Create a route to store the task data in. rte_head = route_head_alloc(); @@ -297,7 +297,7 @@ static void data_read(void) tm.tm_year += 100; } tm.tm_isdst = 0; - date = mktime(&tm) + get_tz_offset(); + date = mkgmtime(&tm); } else { // Store other header data in the track descriptions if (strlen(trk_desc) < MAXDESCLEN) { diff --git a/intdoc/SA2003_an1_dump.pl b/intdoc/SA2003_an1_dump.pl index 5bbb690d1..8bd7ce323 100644 --- a/intdoc/SA2003_an1_dump.pl +++ b/intdoc/SA2003_an1_dump.pl @@ -77,9 +77,20 @@ END while ( $bitmapcount ) { ($rec_type) = shiftunpack( 's' ); if ( $rec_type == 0x4c49 ) { # 'IL' - # I don't know what this structure is, but it appears twice in my test files. - ($unk10101, $unke, $unkc, $unk18_1, $unk18_2, $unkneg1_1, - $unk20, $unkneg1_2, $unkneg1_3) = shiftunpack( 'lsssslsll'); + # This is a Windows ImageList stream. It actually includes the + # 'BM' structures following in the stream, so we could be smarter + # about how many we expect to find. (2 if bit 0 of ilflags is set, + # 1 otherwise. That bit is ILD_MASK.) For now, though, this works + # just fine. Newer versions of the IL structure supposedly contain + # more overlay indices, but SA always seems to use the 0x101 version. + + # Documentation on the stream format is hard to come by. I found + # mine in the form of the WINE project's reimplementation of comctl32. + + ($ilVersion, $ilCount, $ilMax, $ilGrow, $ilcx, $ilcy, + $ilbkColor, $ilflags, $ilovl1, $ilovl2, $ilovl3, $ilovl4 ) = + shiftunpack( 'sssssslsssss' ); + printf( "ver %x count %d max %d grow %d cx %d cy %d bkcolor %x flags %x\n", $ilVersion, $ilCount, $ilMax, $ilGrow, $ilcx, $ilcy, $ilbkColor, $ilflags ); } elsif ( $rec_type == 0x4d42 ) { # 'BM' # This is a standard BMP file, documented in MSDN. @@ -114,7 +125,7 @@ while ( $bitmapcount ) { # fix the hotspot X coord $hotspotx = $rec_type + 0x10000*$hotspotxhi; - printf( "Image: %2d %2d %s $name\n", $hotspotx, $hotspoty, decodeGuid( $guid ) ); + printf( "Image: %2d %2d %s %x $name\n", $hotspotx, $hotspoty, decodeGuid( $guid ), $unk1 ); $imagenames{$guid} = $name; $bitmapcount--; } diff --git a/internal_styles.c b/internal_styles.c index 49efddea3..269b02537 100644 --- a/internal_styles.c +++ b/internal_styles.c @@ -141,8 +141,8 @@ static char fugawi[] = "# fugawi XCSV style file\n" "#\n" "# Format: Fugawi\n" -"# Author: Robert Lipe\n" -"# Date: 03/10/2003\n" +"# Author: Robert Lipe, Patrick Ohly\n" +"# Date: 07/24/2005\n" "#\n" "# \n" @@ -166,7 +166,7 @@ static char fugawi[] = "PROLOGUE \\# Waypoint description\n" "PROLOGUE \\# Latitude in Degree and decimals (soutern hemisphere has neg. degrees)\n" "PROLOGUE \\# Longitude in degree and decimals (neg. numbers: west of Greenwich)\n" -"PROLOGUE \\# Height in meters\n" +"PROLOGUE \\# Height in meters [optional when importing, always present when exporting: Date (GMT) as ISO YYYYMMDD, Time of the day relative to the date as HHMMSS\n" "#\n" "# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:\n" @@ -177,6 +177,8 @@ static char fugawi[] = "IFIELD LAT_DECIMAL, \"\", \"%-.7f\"\n" "IFIELD LON_DECIMAL, \"\", \"%-.7f\"\n" "IFIELD ALT_METERS, \"\", \"%-7.1f\"\n" +"IFIELD GMT_TIME, \"\", \"%Y%m%d\"\n" +"IFIELD HMSG_TIME, \"\", \"%02d%02d%02d\"\n" ; static char gpsdrive[] = "# gpsbabel XCSV style file\n" @@ -212,6 +214,35 @@ static char gpsdrive[] = "OFIELD LON_DECIMAL, \"\", \"%08.5f\"\n" "OFIELD ICON_DESCR, \"\", \"%s\"\n" ; +static char gpsdrivetrack[] = +"# gpsbabel XCSV style file\n" +"#\n" +"# Format: GPSDriveTrack\n" +"# Author: Tobias Minich\n" +"# Date: 12/07/2005\n" +"#\n" +"# \n" +"#\n" + +"DESCRIPTION GpsDrive Format for Tracks\n" + +"# FILE LAYOUT DEFINITIIONS:\n" +"#\n" +"FIELD_DELIMITER WHITESPACE\n" +"RECORD_DELIMITER NEWLINE\n" +"BADCHARS ,'\"\n" + +"SHORTLEN 20\n" +"SHORTWHITE 0\n" + +"#\n" +"# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:\n" + +"OFIELD LAT_DECIMAL, \"\", \"%10.6f\"\n" +"OFIELD LON_DECIMAL, \"\", \"%10.6f\"\n" +"OFIELD ALT_METERS, \"\", \"%10.0f\"\n" +"OFIELD GMT_TIME, \"\", \"%a %b %d %T %Y\"\n" +; static char gpsman[] = "# gpsbabel XCSV style file\n" "#\n" @@ -373,6 +404,55 @@ static char nima[] = "IFIELD DESCRIPTION, \"\", \"%s\" # FULL_NAME_ND\n" "IFIELD IGNORE, \"\", \"%s\" # MODIFY_DATE\n" ; +static char openoffice[] = +"# gpsbabel XCSV style file\n" +"#\n" +"# Format: Tab delimitered csv useful for OpenOffice, Ploticus etc.\n" +"# Author: Tobias Minich\n" +"# Date: 07/18/2005\n" +"#\n" +"#\n" + +"DESCRIPTION Tab delimitered csv useful for OpenOffice, Ploticus etc.\n" + +"# FILE LAYOUT DEFINITIIONS:\n" +"#\n" +"FIELD_DELIMITER TAB\n" +"RECORD_DELIMITER NEWLINE\n" +"BADCHARS TAB\n" + +"#\n" +"# HEADER STUFF:\n" +"#\n" +"PROLOGUE Index Lat Lon Icon Name Description Notes URL Link Text Altitude (m) Distance (km) Speed (m/s) Course (°) Time HDOP VDOP PDOP Satellites Fix\n" + +"#\n" +"# INDIVIDUAL DATA FIELDS:\n" +"#\n" +"IFIELD INDEX, \"\", \"%d\"\n" +"IFIELD LAT_DECIMAL, \"\", \"%f\"\n" +"IFIELD LAT_DIR, \"\", \"%c\"\n" +"IFIELD LAT_HUMAN_READABLE, \"\", \"%d° %f' %c\"\n" +"IFIELD LON_DECIMAL, \"\", \"%f\"\n" +"IFIELD LON_DIR, \"\", \"%c\"\n" +"IFIELD LON_HUMAN_READABLE, \"\", \"%d° %f' %c\"\n" +"IFIELD ICON_DESCR, \"\", \"%s\"\n" +"IFIELD SHORTNAME, \"\", \"%s\"\n" +"IFIELD DESCRIPTION, \"\", \"%s\"\n" +"IFIELD NOTES, \"\", \"%s\"\n" +"IFIELD URL, \"\", \"%s\" \n" +"IFIELD URL_LINK_TEXT, \"\", \"%s\"\n" +"IFIELD ALT_METERS, \"\", \"%f\"\n" +"IFIELD PATH_DISTANCE_KM, \"\", \"%f\"\n" +"IFIELD PATH_SPEED, \"\", \"%f\"\n" +"IFIELD PATH_COURSE, \"\", \"%f\"\n" +"IFIELD EXCEL_TIME, \"\", \"%f\"\n" +"IFIELD GPS_HDOP, \"\", \"%f\"\n" +"IFIELD GPS_VDOP, \"\", \"%f\"\n" +"IFIELD GPS_PDOP, \"\", \"%f\"\n" +"IFIELD GPS_SAT, \"\", \"%d\"\n" +"IFIELD GPS_FIX, \"\", \"%s\"\n" +; static char s_and_t[] = "# gpsbabel XCSV style file\n" "#\n" @@ -389,6 +469,8 @@ static char s_and_t[] = "#\n" "DESCRIPTION Microsoft Streets and Trips 2002-2005\n" +"EXTENSION txt\n" + "#\n" "# FILE LAYOUT DEFINITIIONS:\n" @@ -568,5 +650,5 @@ static char xmapwpt[] = "IFIELD DESCRIPTION, \"\", \"%-.78s\"\n" ; #include "defs.h" -style_vecs_t style_list[] = {{ "xmapwpt", xmapwpt } , { "xmap", xmap } , { "tabsep", tabsep } , { "saplus", saplus } , { "s_and_t", s_and_t } , { "nima", nima } , { "mxf", mxf } , { "mapconverter", mapconverter } , { "gpsman", gpsman } , { "gpsdrive", gpsdrive } , { "fugawi", fugawi } , { "dna", dna } , { "custom", custom } , { "csv", csv } , { "arc", arc } , {0,0}}; -size_t nstyles = 15; +style_vecs_t style_list[] = {{ "xmapwpt", xmapwpt } , { "xmap", xmap } , { "tabsep", tabsep } , { "saplus", saplus } , { "s_and_t", s_and_t } , { "openoffice", openoffice } , { "nima", nima } , { "mxf", mxf } , { "mapconverter", mapconverter } , { "gpsman", gpsman } , { "gpsdrivetrack", gpsdrivetrack } , { "gpsdrive", gpsdrive } , { "fugawi", fugawi } , { "dna", dna } , { "custom", custom } , { "csv", csv } , { "arc", arc } , {0,0}}; +size_t nstyles = 17; diff --git a/jeeps/garminusb.h b/jeeps/garminusb.h index edc7b800d..96acc9232 100644 --- a/jeeps/garminusb.h +++ b/jeeps/garminusb.h @@ -56,3 +56,4 @@ int gusb_cmd_send(const garmin_usb_packet *obuf, size_t sz); int gusb_cmd_get(garmin_usb_packet *ibuf, size_t sz); int gusb_open(const char *portname); int gusb_close(const char *portname); +int gusb_init(void); diff --git a/jeeps/gps.h b/jeeps/gps.h index 69dba75aa..b1de25c0e 100644 --- a/jeeps/gps.h +++ b/jeeps/gps.h @@ -86,6 +86,7 @@ typedef struct GPS_STrack time_t Time; /* Unix time */ float alt; /* Altitude */ float dpth; /* Depth */ + int32 heartrate; /* Heatrate as in Garmin 301 */ int32 tnew; /* New track? */ int32 ishdr; /* Track header? */ int32 dspl; /* Display on map? */ diff --git a/jeeps/gpsapp.c b/jeeps/gpsapp.c index 464845753..4591c8286 100644 --- a/jeeps/gpsapp.c +++ b/jeeps/gpsapp.c @@ -110,8 +110,9 @@ char gps_save_string[GPS_ARB_LEN]; * violently to lower case data. */ typedef enum { UpperNo = 0, UpperYes = 1 } copycase; + static -void copy_char_array(UC **dst, UC* src, int count, copycase mustupper) +void copy_char_array(UC **dst, char* src, int count, copycase mustupper) { UC *d = *dst; int ocount = count; @@ -512,10 +513,11 @@ static void GPS_A001(GPS_PPacket packet) case 300: gps_trk_type = pD300; break; case 301: gps_trk_type = pD301; break; case 302: gps_trk_type = pD302; break; + case 303: gps_trk_type = pD303; break; case 310: gps_trk_hdr_type = pD310; break; case 311: gps_trk_hdr_type = pD311; break; case 312: gps_trk_hdr_type = pD312; break; - default: GPS_Protocol_Error(tag,data); break; + default: GPS_Protocol_Error(tag,data); break; } continue; } @@ -3382,6 +3384,9 @@ int32 GPS_A301_Get(const char *port, GPS_PTrack **trk) case pD302: GPS_D302b_Get(&((*trk)[i]),rec->data); break; + case pD303: + GPS_D303b_Get(&((*trk)[i]),rec->data); + break; default: GPS_Error("A301_GET: Unknown track protocol"); return PROTOCOL_ERROR; @@ -3791,6 +3796,80 @@ void GPS_D302b_Get(GPS_PTrack *trk, UC *data) } +/* @func GPS_D303b_Get ****************************************************** +** +** Get track data (A302 protocol) -- XXX used in Forerunner 301 +** +** @param [w] trk [GPS_PTrack *] track +** @param [r] data [UC *] packet data +** +** @return [void] +************************************************************************/ +void GPS_D303b_Get(GPS_PTrack *trk, UC *data) +{ + UC *p; + uint32 t; + uint32 raw_lat, raw_lon; + int lat_undefined, lon_undefined; + int i; + + p=data; + + /* Latitude and longitude are sometimes invalid (0x7fffffff or + * maybe 0xffffffff?) I guess this makes sense if the device is + * reporting heart rate and time anyway. I presume that latitude + * and longitude are defined or left undefined together? + */ + raw_lat = GPS_Util_Get_Int(p); + lat_undefined = !raw_lat || raw_lat==0x7fffffff || raw_lat==0xffffffff; + if (lat_undefined) + (*trk)->lat=0; + else + (*trk)->lat = GPS_Math_Semi_To_Deg(raw_lat); + p+=sizeof(int32); + + raw_lon = GPS_Util_Get_Int(p); + lon_undefined = !raw_lon || raw_lon==0x7fffffff || raw_lon==0xffffffff; + if (lon_undefined) + (*trk)->lon=0; + else + (*trk)->lon = GPS_Math_Semi_To_Deg(raw_lon); + p+=sizeof(int32); + + if (lat_undefined != lon_undefined) + GPS_Warning("GPS_D303b_Get: assumption (lat_undefined == lon_undefined) violated"); + + t = GPS_Util_Get_Uint(p); + if(!t || t==0x7fffffff || t==0xffffffff) + (*trk)->Time=0; + else + (*trk)->Time = GPS_Math_Gtime_To_Utime((time_t)t); + p+=sizeof(uint32); + + /* When latitude and longitude are undefined, this field seems to be + * a constant on my receiver (51 59 04 69) */ + (*trk)->alt = GPS_Util_Get_Float(p); + if (lat_undefined || lon_undefined) (*trk)->alt = 0.0f; + p+=sizeof(float); + + /* Heartrate is reported as 0 if there is no signal from + * a heartrate monitor. A uint32 is a bit overkill, even + * for me in my state of fitness. Perhaps this is actually + * a char or uint16, leaving room for a trk_seg bool at the end? + */ + (*trk)->heartrate = GPS_Util_Get_Uint(p); + p+=sizeof(uint32); + + /* There doesn't seem to be a trk_seg bool, or at least I've not + * observed it yet. One possibility is to start a new segment + * each time latitude and longitude are undefined? (Ie data from + * the heartrate monitor but none from the GPS. */ + (*trk)->tnew = 0; + + return; +} + + /* @func GPS_D310_Get ****************************************************** ** ** Get track header data (A301 protocol) diff --git a/jeeps/gpsapp.h b/jeeps/gpsapp.h index 4a36fdf4f..a8f6ffb13 100644 --- a/jeeps/gpsapp.h +++ b/jeeps/gpsapp.h @@ -28,6 +28,7 @@ int32 GPS_D300_Get(GPS_PTrack *trk, int32 entries, int32 fd); void GPS_D300b_Get(GPS_PTrack *trk, UC *data); void GPS_D301b_Get(GPS_PTrack *trk, UC *data); void GPS_D302b_Get(GPS_PTrack *trk, UC *data); +void GPS_D303b_Get(GPS_PTrack *trk, UC *data); void GPS_D310_Get(GPS_PTrack *trk, UC *s); void GPS_D311_Get(GPS_PTrack *trk, UC *s); void GPS_D300_Send(UC *data, GPS_PTrack trk); diff --git a/jeeps/gpslibusb.c b/jeeps/gpslibusb.c index d62dd9565..7121b6423 100644 --- a/jeeps/gpslibusb.c +++ b/jeeps/gpslibusb.c @@ -52,6 +52,7 @@ static usb_dev_handle *udev; static void garmin_usb_scan(void); static void garmin_usb_syncup(void); +int gusb_init(void) { // usb_set_debug(99); @@ -90,7 +91,7 @@ gusb_cmd_send(const garmin_usb_packet *opkt, size_t sz) if (r != sz) { fprintf(stderr, "Bad cmdsend r %d sz %d\n", r, sz); if (r < 0) { - fatal("usb_bulk_write failed. '%s'", + fatal("usb_bulk_write failed. '%s'\n", usb_strerror()); } } @@ -104,7 +105,7 @@ gusb_cmd_get(garmin_usb_packet *ibuf, size_t sz) unsigned char *obuf = buf; int r = -1, tsz = 0; - r = usb_interrupt_read(udev, gusb_intr_in_ep, buf, sz, TMOUT_I); + r = usb_interrupt_read(udev, gusb_intr_in_ep, (char *) buf, sz, TMOUT_I); tsz = r; @@ -155,12 +156,12 @@ garmin_usb_start(struct usb_device *dev) udev = usb_open(dev); atexit(garmin_usb_teardown); - if (!udev) { fatal("usb_open failed"); } + if (!udev) { fatal("usb_open failed\n"); } /* * Hrmph. No iManufacturer or iProduct headers.... */ if (usb_set_configuration(udev, 1) < 0) { - fatal("usb_set_configuration failed"); + fatal("usb_set_configuration failed\n"); } if (usb_claim_interface(udev, 0) < 0) { diff --git a/jeeps/gpsprot.h b/jeeps/gpsprot.h index 6a9e75bc1..1d0eb6a42 100644 --- a/jeeps/gpsprot.h +++ b/jeeps/gpsprot.h @@ -174,6 +174,7 @@ int32 gps_rte_link_type; #define pD300 300 #define pD301 301 #define pD302 302 +#define pD303 303 int32 gps_trk_type; diff --git a/jeeps/gpsserial.c b/jeeps/gpsserial.c index 4883b93a3..918423ade 100644 --- a/jeeps/gpsserial.c +++ b/jeeps/gpsserial.c @@ -39,7 +39,7 @@ char *rxdata[] = { "10 f8 0e 56 45 52 53 4d 41 50 31 20 4e 6f 6e 65 00 fb 10 03", /* Guessing from here down */ - /* "10 06 02 fe 00 fa 10 03", /* Ack the unknown packet */ + "10 06 02 fe 00 fa 10 03", /* Ack the unknown packet */ "10 fd 24 50 00 00 4c 01 00 41 0a 00 41 64 00 44 6d 00 41 c9 00 44 ca 00 44 6d 00 44 d2 00 41 2d 01 44 36 01 44 2d 01 66 10 03", /* PTR Array */ "10 06 02 0a 00 ee 10 03", /* Ack */ "10 0e 08 06 04 d4 07 00 17 3a 30 84 10 03", /* DATTIME */ @@ -213,7 +213,7 @@ int32 GPS_Serial_Write(int32 ignored, const void *obuf, int size) } WriteFile (comport, obuf, size, &len, NULL); if (len != (DWORD) size) { - fatal ("Write error. Wrote %d of %d bytes.", len, size); + fatal ("Write error. Wrote %d of %d bytes.\n", len, size); } return len; } diff --git a/jeeps/gpsusbwin.c b/jeeps/gpsusbwin.c index 44f15ddda..7362caf9c 100644 --- a/jeeps/gpsusbwin.c +++ b/jeeps/gpsusbwin.c @@ -124,7 +124,7 @@ gusb_open(const char *pname) if(!DeviceIoControl(usb_handle, IOCTL_GARMIN_USB_BULK_OUT_PACKET_SIZE, NULL, 0, &usb_tx_packet_size, GARMIN_USB_INTERRUPT_DATA_SIZE, &size, NULL)) { - fatal("Couldn't get USB packet size"); + fatal("Couldn't get USB packet size.\n"); } if (pdd) { @@ -192,7 +192,7 @@ gusb_cmd_get(garmin_usb_packet *ibuf, size_t sz) if(!DeviceIoControl(usb_handle, IOCTL_GARMIN_USB_INTERRUPT_IN, NULL, 0, buf, GARMIN_USB_INTERRUPT_DATA_SIZE, &rxed, NULL)) { GPS_Serial_Error("Ioctl"); - fatal("ioctl"); + fatal("ioctl\n"); } buf += rxed; sz -= rxed; diff --git a/kml.c b/kml.c index 606e5e29d..5d2b6baec 100644 --- a/kml.c +++ b/kml.c @@ -1,5 +1,5 @@ /* - Support for Keyhole "kml" format. + Support for Google Earth & Keyhole "kml" format. Copyright (C) 2005 Robert Lipe, robertlipe@usa.net Updates by Andrew Kirmse, akirmse at google.com @@ -22,16 +22,45 @@ #include "defs.h" #include "xmlgeneric.h" -static char *deficon = NULL; +// options +static char *opt_deficon = NULL; +static char *opt_export_lines = NULL; +static char *opt_export_points = NULL; +static char *opt_line_width = NULL; +static char *opt_line_color = NULL; + +static int export_lines; +static int export_points; static waypoint *wpt_tmp; FILE *fd; FILE *ofd; +typedef struct { + double latitude; + double longitude; + double altitude; +} point3d; + +static int point3d_list_len; +static point3d *point3d_list; + static arglist_t kml_args[] = { - {"deficon", &deficon, "Default icon name", NULL, ARGTYPE_STRING }, + {"deficon", &opt_deficon, "Default icon name", NULL, ARGTYPE_STRING }, + {"lines", &opt_export_lines, + "Export linestrings for tracks and routes", + "1", ARGTYPE_BOOL }, + {"points", &opt_export_points, + "Export placemarks for tracks and routes", + "1", ARGTYPE_BOOL }, + {"line_width", &opt_line_width, + "Width of lines, in pixels", + "6", ARGTYPE_BOOL }, + {"line_color", &opt_line_color, + "Line color, specified in hex AABBGGRR", + "64eeee17", ARGTYPE_BOOL }, {0, 0, 0, 0, 0} }; @@ -55,15 +84,14 @@ static xg_callback wpt_name, wpt_desc, wpt_coord; static xg_tag_mapping kml_map[] = { - { wpt_s, cb_start, "/Folder/Placemark" }, - { wpt_e, cb_end, "/Folder/Placemark" }, -// { wpt_name_s, cb_start, "/Folder/Placemark/name" }, - { wpt_name, cb_cdata, "/Folder/Placemark/name" }, - { wpt_desc, cb_cdata, "/Folder/Placemark/description" }, + { wpt_s, cb_start, "/Document/Folder/Placemark" }, + { wpt_e, cb_end, "/Document/Folder/Placemark" }, + { wpt_name, cb_cdata, "/Document/Folder/Placemark/name" }, + { wpt_desc, cb_cdata, "/Document/Folder/Placemark/description" }, // { wpt_type, cb_cdata, "/Folder/Placemark/type" }, // { wpt_link_s, cb_start, "/Folder/Placemark/link" }, // { wpt_link, cb_cdata, "/Folder/Placemark/link" }, - { wpt_coord, cb_cdata, "/Folder/Placemark/Point/coordinates" }, + { wpt_coord, cb_cdata, "/Document/Folder/Placemark/Point/coordinates" }, { NULL, 0, NULL } }; @@ -110,7 +138,7 @@ static void kml_rd_init(const char *fname) { - xml_init(fname, kml_map); + xml_init(fname, kml_map, NULL); } static @@ -139,6 +167,19 @@ kml_wr_deinit(void) fclose(ofd); } +static void kml_write_bitmap_style(const char *style, int bitmap, + int x, int y, int width, int height) +{ + fprintf(ofd, "\n"); +} + + static void kml_output_timestamp(const waypoint *waypointp) { if (waypointp->creation_time) { @@ -149,6 +190,87 @@ static void kml_output_timestamp(const waypoint *waypointp) } } + +static void kml_output_header(const route_head *header) +{ + fprintf(ofd, "\n"); + fprintf(ofd, " 1\n"); + write_optional_xml_entity(ofd, " ", "name", header->rte_name); + write_optional_xml_entity(ofd, " ", "desc", header->rte_desc); + + if (export_points && header->rte_waypt_ct > 0) { + // Put the points in a subfolder + fprintf(ofd, " \n"); + fprintf(ofd, " 1\n"); + fprintf(ofd, " Points\n"); + } + + // Create an array for holding waypoint coordinates so that we + // can produce a LineString at the end. + point3d_list = (point3d *) xmalloc(header->rte_waypt_ct * sizeof(point3d)); + point3d_list_len = 0; +} + + +static void kml_output_point(const waypoint *waypointp, const char *style) +{ + // Save off this point for later use + point3d *pt = &point3d_list[point3d_list_len]; + point3d_list_len++; + pt->longitude = waypointp->longitude; + pt->latitude = waypointp->latitude; + pt->altitude = waypointp->altitude == unknown_alt ? 0.0 : waypointp->altitude; + + if (export_points) { + fprintf(ofd, "\t\n"); + fprintf(ofd, "\t %s\n", style); + fprintf(ofd, "\t \n"); + fprintf(ofd, "\t %f,%f,%f\n", + pt->longitude, pt->latitude, pt->altitude); + fprintf(ofd, "\t \n"); + + // Timestamp + kml_output_timestamp(waypointp); + + fprintf(ofd, "\t\n"); + } +} + + +static void kml_output_tailer(const route_head *header) +{ + int i; + + if (export_points && point3d_list_len > 0) { + fprintf(ofd, " \n"); + } + + // Add a linestring for this track? + if (export_lines && point3d_list_len > 0) { + fprintf(ofd, "\t\n"); + fprintf(ofd, "\t #lineStyle\n"); + fprintf(ofd, "\t Path\n"); + fprintf(ofd, "\t \n"); + fprintf(ofd, "\t \n"); + fprintf(ofd, "\t \n"); + for (i = 0; i < point3d_list_len; ++i) + fprintf(ofd, "%f,%f,%f ", + point3d_list[i].longitude, + point3d_list[i].latitude, + point3d_list[i].altitude); + + fprintf(ofd, "\n\t \n"); + fprintf(ofd, "\t \n"); + fprintf(ofd, "\t \n"); + fprintf(ofd, "\t\n"); + } + + xfree(point3d_list); + point3d_list = NULL; + + fprintf(ofd, "\n"); +} + /* * WAYPOINTS */ @@ -156,7 +278,7 @@ static void kml_output_timestamp(const waypoint *waypointp) static void kml_waypt_pr(const waypoint *waypointp) { fprintf(ofd, "\t\n"); - write_optional_xml_entity(ofd, "\t", "name", waypointp->description); + write_optional_xml_entity(ofd, "\t", "name", waypointp->shortname); fprintf(ofd, "\t #waypoint\n"); // Description @@ -188,31 +310,17 @@ static void kml_waypt_pr(const waypoint *waypointp) static void kml_track_hdr(const route_head *header) { - fprintf(ofd, "\n"); - fprintf(ofd, " 1\n"); - write_optional_xml_entity(ofd, " ", "name", header->rte_name); - write_optional_xml_entity(ofd, " ", "desc", header->rte_desc); + kml_output_header(header); } static void kml_track_disp(const waypoint *waypointp) { - fprintf(ofd, "\t\n"); - fprintf(ofd, "\t #track\n"); - fprintf(ofd, "\t \n"); - fprintf(ofd, "\t %f,%f,%f\n", - waypointp->longitude, waypointp->latitude, - waypointp->altitude == unknown_alt ? 0.0 : waypointp->altitude); - fprintf(ofd, "\t \n"); - - // Timestamp - kml_output_timestamp(waypointp); - - fprintf(ofd, "\t\n"); + kml_output_point(waypointp, "#track"); } static void kml_track_tlr(const route_head *header) { - fprintf(ofd, "\n"); + kml_output_tailer(header); } /* @@ -221,48 +329,25 @@ static void kml_track_tlr(const route_head *header) static void kml_route_hdr(const route_head *header) { - fprintf(ofd, "\n"); - fprintf(ofd, " 1\n"); - write_optional_xml_entity(ofd, " ", "name", header->rte_name); - write_optional_xml_entity(ofd, " ", "desc", header->rte_desc); + kml_output_header(header); } static void kml_route_disp(const waypoint *waypointp) { - fprintf(ofd, "\t\n"); - fprintf(ofd, "\t #route\n"); - fprintf(ofd, "\t \n"); - fprintf(ofd, "\t %f,%f,%f\n", - waypointp->longitude, waypointp->latitude, - waypointp->altitude == unknown_alt ? 0.0 : waypointp->altitude); - fprintf(ofd, "\t \n"); - write_optional_xml_entity(ofd, "\t", "name", waypointp->description); - - // Timestamp - kml_output_timestamp(waypointp); - - fprintf(ofd, "\t\n"); + kml_output_point(waypointp, "#route"); } static void kml_route_tlr(const route_head *header) { - fprintf(ofd, "\n"); + kml_output_tailer(header); } -static void kml_write_bitmap_style(const char *style, int bitmap, - int x, int y, int width, int height) -{ - fprintf(ofd, "\n"); -} - void kml_write(void) { + // Parse options + export_lines = (0 == strcmp("1", opt_export_lines)); + export_points = (0 == strcmp("1", opt_export_points)); + fprintf(ofd, "\n"); fprintf(ofd, "\n"); // TODO(akirmse): Put in device name, maybe time? @@ -273,6 +358,14 @@ void kml_write(void) kml_write_bitmap_style("track", 4, 128, 0, 32, 32); kml_write_bitmap_style("waypoint", 4, 160, 0, 32, 32); kml_write_bitmap_style("route", 4, 160, 0, 32, 32); + + // Style settings for line strings + fprintf(ofd, "\n"); fprintf(ofd, "\n"); fprintf(ofd, "Waypoints\n"); @@ -301,7 +394,7 @@ void kml_write(void) ff_vecs_t kml_vecs = { ff_type_file, - FF_CAP_RW_WPT, /* Format can do RW_ALL */ + FF_CAP_RW_ALL, /* Format can do RW_ALL */ kml_rd_init, kml_wr_init, kml_rd_deinit, diff --git a/lowranceusr.c b/lowranceusr.c index 12b78e375..fd6d4288d 100644 --- a/lowranceusr.c +++ b/lowranceusr.c @@ -17,6 +17,12 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + HISTORY: + + 6/21/05 - Ling Nero (rnlnero@yahoo.com) + - Added Routes, Icons, & Tracks support + - Fixed waypoint date/time stamp conversion */ @@ -29,6 +35,8 @@ typedef struct lowranceusr_icon_mapping { const char *icon; } lowranceusr_icon_mapping_t; +#define DEF_ICON 10001 + /* Taken from iFinder 1.8 */ const lowranceusr_icon_mapping_t lowranceusr_icon_value_table[] = { { 10000, "diamond 1" }, @@ -82,6 +90,47 @@ const lowranceusr_icon_mapping_t lowranceusr_icon_value_table[] = { { 10007, "Post Office" }, /* Icon for "house" */ { 10019, "Event Cache" }, /* Icon for "person" */ { 10020, "Webcam Cache" }, /* Icon for "restrooms" */ + +/* The following list is from TopoFusion */ + + { 10000, "Waypoint" }, /* diamond 1 */ + { DEF_ICON, "Text Label (No Dot)" }, + { 10018, "Trailhead" }, /* american flag */ + { 10023, "Campground" }, /* campsite */ + { 10022, "Summit" }, /* mountains */ + { DEF_ICON, "Tall Tower" }, + { DEF_ICON, "Short Tower" }, + { 10021, "Forest" }, /* tree */ + { DEF_ICON, "Mine" }, + { 10038, "Geocache" }, /* flag buoy */ + { 10016, "Geocache Found" }, /* exclamation */ + { DEF_ICON, "Skiing Area" }, + { 10029, "Crossing" }, /* bridge */ + { 10007, "House" }, /* house */ + { 10003, "Dot" }, /* x 1 */ + { 10025, "Hunting Area" }, /* deer */ + { 10031, "Fishing Area" }, /* fish */ + { 10040, "Swimming Area" }, /* swimmer */ + { 10012, "Telephone" }, /* telephone */ + { 10024, "Rest Area" }, /* picnic table */ + { 10021, "Park" }, /* tree */ + { 10007, "Information" }, /* house */ + { 10022, "Scenic Area" }, /* mountains */ + { DEF_ICON, "Bank/Dollar" }, + { 10009, "Hotel" }, /* store */ + { 10011, "Restaurant" }, /* fork and spoon */ + { 10030, "Danger Area" }, /* skull and crossbones */ + { 10035, "Anchor" }, /* anchor */ + { 10002, "City (Large)" }, /* diamond 3 */ + { 10001, "City (Medium)" }, /* diamond 2 */ + { 10000, "City (Small)" }, /* diamond 1 */ + { DEF_ICON, "Drinking Water" }, + { 10008, "Parking Area" }, /* car */ + { 10023, "RV Park" }, /* campsite */ + { 10020, "Rest Room" }, /* restroom */ + { 10019, "Shower" }, /* person */ + { DEF_ICON, "Tunnel" }, + { -1, NULL } }; @@ -90,13 +139,26 @@ static FILE *file_out; static void *mkshort_handle; static unsigned short waypt_out_count; +static unsigned int trail_count, lowrance_route_count; +static int trail_point_count; +static char continuous = 1; +static short num_section_points; +static route_head *trk_head; +static route_head *rte_head; +static char *ignoreicons; +static char *merge; +static char *seg_break; #define MYNAME "Lowrance USR" #define MAXUSRSTRINGSIZE 256 #define SEMIMINOR 6356752.3142 #define DEGREESTORADIANS 0.017453292 -#define SECSTO2000 946713599 +#define SECSTO2000 946713600 +#define MAX_TRAIL_POINTS 9999 + +/* Jan 1, 2000 00:00:00 */ +struct tm base_time = { 0, 0, 0, 1, 0, 100, 5, 1, -1 }; static size_t @@ -132,10 +194,9 @@ long int lowranceusr_find_icon_number_from_desc(const char *desc) { const lowranceusr_icon_mapping_t *i; - long int def_icon = 10001; if (!desc) { - return def_icon; + return DEF_ICON; } for (i = lowranceusr_icon_value_table; i->icon; i++) { @@ -144,7 +205,7 @@ lowranceusr_find_icon_number_from_desc(const char *desc) } } - return def_icon; + return DEF_ICON; } static int lowranceusr_fread(void *buff, size_t size, size_t members, FILE * fp) @@ -162,7 +223,13 @@ lowranceusr_fread(void *buff, size_t size, size_t members, FILE * fp) static arglist_t lowranceusr_args[] = { - {0, 0, 0, 0,0 } + {"ignoreicons", &ignoreicons, "Ignore event marker icons", + NULL, ARGTYPE_BOOL }, + {"merge", &merge, "(USR output) Merge into one segmented track", + NULL, ARGTYPE_BOOL }, + {"break", &seg_break, "(USR input) Break segments into separate tracks", + NULL, ARGTYPE_BOOL }, + {NULL, NULL, NULL, NULL, 0} }; static void @@ -216,25 +283,285 @@ lat_deg_to_mm(double x) { return (long)(SEMIMINOR * log(tan((x * DEGREESTORADIANS + M_PI / 2) / 2))); } +static void +lowranceusr_parse_waypt(waypoint *wpt_tmp) +{ + char buff[MAXUSRSTRINGSIZE + 1]; + long int TextLen; + time_t waypt_time; + short waypt_type; + time_t base_time_secs = mktime(&base_time); + + lowranceusr_fread(&buff[0], 4, 1, file_in); + wpt_tmp->latitude = lat_mm_to_deg(le_read32(&buff[0])); + lowranceusr_fread(&buff[0], 4, 1, file_in); + wpt_tmp->longitude = lon_mm_to_deg(le_read32(&buff[0])); + lowranceusr_fread(&buff[0], 4, 1, file_in); + wpt_tmp->altitude = FEET_TO_METERS(le_read32(&buff[0])); + lowranceusr_fread(&buff[0], 4, 1, file_in); + TextLen = buff[0]; + lowranceusr_fread(&buff[0], TextLen, 1, file_in); + buff[TextLen] = '\0'; + wpt_tmp->shortname = xstrdup(buff); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE parse_waypt: Waypt name = %s Lat = %f Lon = %f alt = %f\n",wpt_tmp->shortname, wpt_tmp->latitude, + wpt_tmp->longitude, wpt_tmp->altitude); + + lowranceusr_fread(&buff[0], 4, 1, file_in); + TextLen = buff[0]; + if (TextLen) { + lowranceusr_fread(&buff[0], TextLen, 1, file_in); + buff[TextLen] = '\0'; + wpt_tmp->description = xstrdup(buff); + } + lowranceusr_fread(&buff[0], 4, 1, file_in); + /* Time is number of seconds since Jan. 1, 2000 */ + waypt_time = le_read32(&buff[0]); + if (waypt_time) + wpt_tmp->creation_time = base_time_secs + waypt_time; + + if (global_opts.debug_level >= 2) + { + printf("LOWRANCE parse_waypt: creation time %ld\n", + wpt_tmp->creation_time); + printf("LOWRANCE parse_waypt: base_time %ld\n", base_time_secs); + printf("LOWRANCE parse_waypt: waypt time %ld\n", waypt_time); + } + + /* Symbol ID */ + lowranceusr_fread(&buff[0], 4, 1, file_in); + wpt_tmp->icon_descr = lowranceusr_find_desc_from_icon_number(le_read32(&buff[0])); + + /* Waypoint Type (USER, TEMPORARY, POINT_OF_INTEREST) */ + lowranceusr_fread(&buff[0], 2, 1, file_in); + waypt_type = le_read16(&buff[0]); + if (global_opts.debug_level >= 1) + printf("LOWRANCEUSR parse_waypt: waypt_type = %d\n",waypt_type); + +} + + + +static void +lowranceusr_parse_routes(void) +{ + char buff[MAXUSRSTRINGSIZE + 1]; + short int num_routes, num_legs; + int i,j; + long int text_len; + waypoint *wpt_tmp; + + lowranceusr_fread(&buff[0], 2, 1, file_in); + num_routes = le_read16(&buff[0]); + + if (global_opts.debug_level >= 1) + printf("LOWRANCAE parse_routes: Num Routes = %d\n", num_routes); + + for (i=0; i < num_routes; i++) + { + rte_head = route_head_alloc(); + route_add_head(rte_head); + rte_head->rte_num = i+1; + + /* route name */ + lowranceusr_fread(&buff[0], 4, 1, file_in); + text_len = buff[0]; + if (text_len) + { + lowranceusr_fread(&buff[0], text_len, 1, file_in); + buff[text_len] = '\0'; + } + rte_head->rte_name = xstrdup(buff); + rte_head->rte_desc = '\0'; + + /* num Legs */ + lowranceusr_fread(&buff[0], 2, 1, file_in); + num_legs = le_read16(&buff[0]); + + /* route reversed */ + lowranceusr_fread(&buff[0], 1, 1, file_in); + + /* waypoints */ + for (j=0; j < num_legs; j++) + { + wpt_tmp = waypt_new(); + lowranceusr_parse_waypt(wpt_tmp); + route_add_wpt(rte_head, wpt_tmp); + } + } +} + +/* + * Icons are automatically converted to waypoints unless + * option of ignoreicons is used + */ +static void +lowranceusr_parse_icons(void) +{ + char buff[MAXUSRSTRINGSIZE + 1]; + short int num_icons; + int i; + + lowranceusr_fread(&buff[0], 2, 1, file_in); + num_icons = le_read16(&buff[0]); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE parse_icons: num Icons = %d\n", num_icons); + + for (i=0; i < num_icons; i++) + { + if (ignoreicons) + { + /* position coord lat & long */ + lowranceusr_fread(&buff[0], 4, 2, file_in); + /* symbol */ + lowranceusr_fread(&buff[0], 4, 1, file_in); + } + else + { + waypoint *wpt_tmp; + wpt_tmp = waypt_new(); + + /* position coord lat & long */ + lowranceusr_fread(&buff[0], 4, 1, file_in); + wpt_tmp->latitude = lat_mm_to_deg(le_read32(&buff[0])); + lowranceusr_fread(&buff[0], 4, 1, file_in); + wpt_tmp->longitude = lon_mm_to_deg(le_read32(&buff[0])); + wpt_tmp->altitude = 0; + sprintf(buff,"Icon %d", i+1); + wpt_tmp->shortname = xstrdup(buff); + /* symbol */ + lowranceusr_fread(&buff[0], 4, 1, file_in); + wpt_tmp->icon_descr = lowranceusr_find_desc_from_icon_number(le_read32(&buff[0])); + waypt_add(wpt_tmp); + } + } + +} + +static void +lowranceusr_parse_trails(void) +{ + char buff[MAXUSRSTRINGSIZE + 1]; + short int num_trails, num_trail_points, num_section_points; + int i,j, trk_num; + long int text_len; + waypoint *wpt_tmp; + route_head *trk_tmp; + + /* num trails */ + lowranceusr_fread(&buff[0], 2, 1, file_in); + num_trails = le_read16(&buff[0]); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE parse_trails: num trails = %d\n", num_trails); + + for (i=trk_num=0; i < num_trails; i++) + { + trk_head = route_head_alloc(); + trk_head->rte_num = ++trk_num; + track_add_head(trk_head); + + /* trail name */ + lowranceusr_fread(&buff[0], 4, 1, file_in); + text_len = buff[0]; + +if (global_opts.debug_level >= 1) + printf("LOWRANCE parse_trails: name text len = %ld\n", text_len); + + if (text_len) + lowranceusr_fread(&buff[0], text_len, 1, file_in); + + buff[text_len] = '\0'; + trk_head->rte_name = xstrdup(buff); + trk_head->rte_desc = '\0'; + +if (global_opts.debug_level >= 1) + printf("LOWRANCE parse_trails: trail name = %s\n", trk_head->rte_name); + + /* visible */ + lowranceusr_fread(&buff[0], 1, 1, file_in); + /* num trail points */ + lowranceusr_fread(&buff[0], 2, 1, file_in); + num_trail_points = le_read16(&buff[0]); + +if (global_opts.debug_level >= 1) + printf("LOWRANCE parse_trails: num trail points = %d\n", num_trail_points); + + /* max trail size */ + lowranceusr_fread(&buff[0], 2, 1, file_in); + +if (global_opts.debug_level >= 1) + printf("LOWRANCE parse_trails: max trail size = %d\n", le_read16(&buff[0])); + + if (num_trail_points) + { + + while (num_trail_points) + { + /* num section points */ + lowranceusr_fread(&buff[0], 2, 1, file_in); + num_section_points = le_read16(&buff[0]); + +if (global_opts.debug_level >= 1) + printf("LOWRANCE parse_trails: num section points = %d\n", num_section_points); + + for (j=0; j < num_section_points; j++, num_trail_points--) + { + wpt_tmp = waypt_new(); + lowranceusr_fread(&buff[0], 4, 1, file_in); + wpt_tmp->latitude = lat_mm_to_deg(le_read32(&buff[0])); + lowranceusr_fread(&buff[0], 4, 1, file_in); + wpt_tmp->longitude = lon_mm_to_deg(le_read32(&buff[0])); + /* continuous */ + lowranceusr_fread(&buff[0], 1, 1, file_in); + if (!buff[0] && seg_break && j) + { + trk_tmp = route_head_alloc(); + trk_tmp->rte_num = ++trk_num; + trk_tmp->rte_name = xstrdup(trk_head->rte_name); + trk_tmp->rte_desc = '\0'; + track_add_head(trk_tmp); + trk_head = trk_tmp; + } + route_add_wpt(trk_head, wpt_tmp); + +if (global_opts.debug_level >= 1) + printf("LOWRANCE parse_trails: Trail pt lat %f lon %f\n", wpt_tmp->latitude, wpt_tmp->longitude); + } + } + } + /* remove the trail since it's empty */ + else track_del_head(trk_head); + } +} + static void data_read(void) { char buff[MAXUSRSTRINGSIZE + 1]; - short int NumWaypoints, MajorVersion, MinorVersion; + short int NumWaypoints, MajorVersion, MinorVersion, object_num; int i; - long int TextLen; lowranceusr_fread(&buff[0], 2, 1, file_in); MajorVersion = le_read16(&buff[0]); lowranceusr_fread(&buff[0], 2, 1, file_in); MinorVersion = le_read16(&buff[0]); + if (global_opts.debug_level >= 1) + printf("LOWRANCE data_read: Major Version %d Minor Version %d\n", MajorVersion, MinorVersion); + if (MajorVersion < 2) { fatal(MYNAME ": input file is from an old version of the USR file and is not supported\n"); } lowranceusr_fread(&buff[0], 2, 1, file_in); NumWaypoints = le_read16(&buff[0]); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE data_read: Num waypoints %d\n", NumWaypoints); + for (i = 0; i < NumWaypoints; i++) { waypoint *wpt_tmp; @@ -242,54 +569,30 @@ data_read(void) /* Object num */ lowranceusr_fread(&buff[0], 2, 1, file_in); - lowranceusr_fread(&buff[0], 4, 1, file_in); - wpt_tmp->latitude = lat_mm_to_deg(le_read32(&buff[0])); - lowranceusr_fread(&buff[0], 4, 1, file_in); - wpt_tmp->longitude = lon_mm_to_deg(le_read32(&buff[0])); - lowranceusr_fread(&buff[0], 4, 1, file_in); - wpt_tmp->altitude = le_read32(&buff[0]); - - lowranceusr_fread(&buff[0], 4, 1, file_in); - TextLen = buff[0]; - lowranceusr_fread(&buff[0], TextLen, 1, file_in); - buff[TextLen] = '\0'; - wpt_tmp->shortname = xstrdup(buff); - - lowranceusr_fread(&buff[0], 4, 1, file_in); - TextLen = buff[0]; - if (TextLen) { - lowranceusr_fread(&buff[0], TextLen, 1, file_in); - buff[TextLen] = '\0'; - wpt_tmp->description = xstrdup(buff); - } - - lowranceusr_fread(&buff[0], 4, 1, file_in); - /* Time is number of seconds since Jan. 1, 2000 */ - wpt_tmp->creation_time = SECSTO2000 + le_read32(&buff[0]); - - /* Symbol ID */ - lowranceusr_fread(&buff[0], 4, 1, file_in); - wpt_tmp->icon_descr = lowranceusr_find_desc_from_icon_number(le_read32(&buff[0])); + object_num = le_read16(&buff[0]); + if (global_opts.debug_level >= 1) + printf("LOWRANCE data_read: object_num = %d\n", object_num); - /* Waypoint Type (USER, TEMPORARY, POINT_OF_INTEREST) */ - lowranceusr_fread(&buff[0], 2, 1, file_in); + /* waypoint */ + lowranceusr_parse_waypt(wpt_tmp); waypt_add(wpt_tmp); } + + lowranceusr_parse_routes(); + lowranceusr_parse_icons(); + lowranceusr_parse_trails(); } static void -lowranceusr_waypt_pr(const waypoint *wpt) +lowranceusr_waypt_disp(const waypoint *wpt) { int TextLen, Lat, Lon, Time, SymbolId; short int WayptType; char *name; char *comment; - int alt = wpt->altitude; - - /* our personal waypoint counter */ - my_fwrite2((short *) &waypt_out_count, file_out); - waypt_out_count++; + int alt = METERS_TO_FEET(wpt->altitude); + time_t base_time_secs = mktime(&base_time); Lat = lat_deg_to_mm(wpt->latitude); my_fwrite4(&Lat, file_out); @@ -297,6 +600,9 @@ lowranceusr_waypt_pr(const waypoint *wpt) my_fwrite4(&Lon, file_out); my_fwrite4(&alt, file_out); + if (global_opts.debug_level >= 1) + printf("LOWRANCE waypt_disp: Lat = %d\nLon = %d\nAlt = %d\n",Lat, Lon, alt); + /* Try and make sure we have a name */ if ((! wpt->shortname) || global_opts.synthesize_shortnames) { if (wpt->description && global_opts.synthesize_shortnames) { @@ -315,6 +621,10 @@ lowranceusr_waypt_pr(const waypoint *wpt) TextLen = strlen(name); my_fwrite4(&TextLen, file_out); fwrite(name, 1, TextLen, file_out); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE waypt_disp: Waypt name = %s\n",name); + xfree(name); /** @@ -331,11 +641,21 @@ lowranceusr_waypt_pr(const waypoint *wpt) my_fwrite4(&TextLen, file_out); } - if (wpt->creation_time > SECSTO2000) { - Time = wpt->creation_time - SECSTO2000; + if (wpt->creation_time > base_time_secs) { + Time = wpt->creation_time - base_time_secs; } else { - Time = SECSTO2000 + 1; + Time = 0; + } + + if (global_opts.debug_level >= 2) + { + time_t wpt_time = Time; + printf("LOWRANCE waypt_disp: base_time : %ld\n",base_time_secs); + printf("LOWRANCE waypt_disp: creation time : %ld\n",wpt->creation_time); + printf("LOWRANCE waypt_disp: waypt time : %ld\n",wpt_time); + printf("LOWRANCE waypt_disp: waypt time (local): %s\n",ctime(&wpt_time)); } + my_fwrite4(&Time, file_out); if (get_cache_icon(wpt) && wpt->icon_descr && (strcmp(wpt->icon_descr, "Geocache Found") != 0)) { @@ -351,6 +671,201 @@ lowranceusr_waypt_pr(const waypoint *wpt) my_fwrite2(&WayptType, file_out); } +static void +lowranceusr_waypt_pr(const waypoint *wpt) +{ + + /* our personal waypoint counter */ + my_fwrite2((short *) &waypt_out_count, file_out); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE waypt_pr: waypoint #%d ",waypt_out_count); + + waypt_out_count++; + + lowranceusr_waypt_disp(wpt); +} + +/* + * Header format: + * short num_trails, + * int trail_name text length, + * char *trail_name, + * boolean visible, + * short num_trail_points, + * short max_trail_size, + * short num_section_points + * == don't know how many max points per section so + * == use num_trail_points for now + * == Once this is known then the waypoints ought to be + * == broken up into sections + */ + +static void +lowranceusr_track_hdr(const route_head *trk) +{ + int text_len; + char *name, tmp_name[20]; + short num_trail_points, max_trail_size; + char visible=1; + + ++trail_count; + if (trk->rte_name) { + name = xstrdup(trk->rte_name); + } else if (trk->rte_desc) { + name = xstrdup(trk->rte_desc); + } else + { + tmp_name[0]='\0'; + sprintf(tmp_name, "Babel %d", trail_count); + name = xstrdup(tmp_name); + } + + text_len = strlen(name); + if (global_opts.debug_level >= 1) + printf("LOWRANCE track_hdr: trail name text len = %d\n", text_len); + my_fwrite4(&text_len, file_out); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE track_hdr: trail name = %s\n", name); + + fwrite(name, 1, text_len, file_out); + + num_trail_points = (short) trk->rte_waypt_ct; + max_trail_size = MAX_TRAIL_POINTS; + if (num_trail_points > max_trail_size) + num_trail_points = max_trail_size; + num_section_points = num_trail_points; + + if (global_opts.debug_level >= 1) + printf("LOWRANCE track_hdr: num_trail_points = %d\nmax_trail_size = %d\nnum_section_points = %d\n", + num_trail_points, max_trail_size, num_section_points); + + fwrite(&visible, 1, 1, file_out); + my_fwrite2(&num_trail_points, file_out); + my_fwrite2(&max_trail_size, file_out); + my_fwrite2(&num_section_points, file_out); + xfree(name); + trail_point_count=1; +} + +static void +lowranceusr_route_hdr(const route_head *rte) +{ + int text_len; + char *name, tmp_name[20]; + short num_legs; + char route_reversed=0; + + /* route name */ + if (rte->rte_name) { + name = xstrdup(rte->rte_name); + } else if (rte->rte_desc) { + name = xstrdup(rte->rte_desc); + } else + { + tmp_name[0]='\0'; + sprintf(tmp_name, "Babel R%d", ++lowrance_route_count); + name = xstrdup(tmp_name); + } + text_len = strlen(name); + my_fwrite4(&text_len, file_out); + fwrite(name, 1, text_len, file_out); + xfree(name); + + /* num legs */ + num_legs = (short) rte->rte_waypt_ct; + my_fwrite2(&num_legs, file_out); + fwrite(&route_reversed, 1, 1, file_out); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE route_hdr: route name \"%s\" num_legs = %d\n", + rte->rte_name, num_legs); + +} + +static void +lowranceusr_track_disp(const waypoint *wpt) +{ + int lat, lon; + + if (++trail_point_count <= MAX_TRAIL_POINTS) + { + lat = lat_deg_to_mm(wpt->latitude); + lon = lon_deg_to_mm(wpt->longitude); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE track_disp: Trail point #%d lat = %d long = %d\n",trail_point_count, lat, lon); + + my_fwrite4(&lat, file_out); + my_fwrite4(&lon, file_out); + fwrite(&continuous, 1, 1, file_out); + if (!continuous) + continuous = 1; + } +} + +static void +lowranceusr_merge_track_hdr(const route_head *trk) +{ + int text_len; + char *name, tmp_name[20]; + + if (++trail_count == 1) + { + if (trk->rte_name) { + name = xstrdup(trk->rte_name); + } else if (trk->rte_desc) { + name = xstrdup(trk->rte_desc); + } else + { + tmp_name[0]='\0'; + sprintf(tmp_name, "Babel %d", trail_count); + name = xstrdup(tmp_name); + } + text_len = strlen(name); + my_fwrite4(&text_len, file_out); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE track_hdr: trail name = %s\n", name); + + fwrite(name, 1, text_len, file_out); + } + + trail_point_count += (short) trk->rte_waypt_ct; +} + +static void +lowranceusr_merge_track_tlr(const route_head *trk) +{ + short num_trail_points, max_trail_size; + char visible=1; + + if (trail_count == track_count()) /* last trail */ + { + num_trail_points = trail_point_count; + max_trail_size = MAX_TRAIL_POINTS; + if (num_trail_points > max_trail_size) + num_trail_points = max_trail_size; + num_section_points = num_trail_points; + + if (global_opts.debug_level >= 1) + printf("LOWRANCE merge_track_tlr: num_trail_points = %d\nmax_trail_size = %d\nnum_section_points = %d\n", + num_trail_points, max_trail_size, num_section_points); + + fwrite(&visible, 1, 1, file_out); + my_fwrite2(&num_trail_points, file_out); + my_fwrite2(&max_trail_size, file_out); + my_fwrite2(&num_section_points, file_out); + } +} +static void + +lowranceusr_merge_track_hdr_2(const route_head *trk) +{ + continuous = 0; +} + static void data_write(void) { @@ -358,26 +873,72 @@ data_write(void) setshort_length(mkshort_handle, 15); MajorVersion = 2; MinorVersion = 0; + NumWaypoints = waypt_count(); my_fwrite2(&MajorVersion, file_out); my_fwrite2(&MinorVersion, file_out); my_fwrite2(&NumWaypoints, file_out); - waypt_disp_all(lowranceusr_waypt_pr); - /* We don't support these yet... */ - NumRoutes = 0; + if (global_opts.debug_level >= 1) + printf("LOWRANCE data_write: Num waypoints = %d\n", NumWaypoints); + + if (NumWaypoints) + waypt_disp_all(lowranceusr_waypt_pr); + + /* Route support added 6/21/05 */ + NumRoutes = route_count(); my_fwrite2(&NumRoutes, file_out); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE data_write: Num routes = %d\n", NumRoutes); + + if (NumRoutes) + { + lowrance_route_count=0; + route_disp_all(lowranceusr_route_hdr, NULL, lowranceusr_waypt_disp); + } + + /* no support for Icons */ NumIcons = 0; my_fwrite2(&NumIcons, file_out); - NumTrails = 0; - my_fwrite2(&NumTrails, file_out); + + /* Track support added 6/21/05 */ + NumTrails = track_count(); + + if (NumTrails && merge) + { + NumTrails = 1; + my_fwrite2(&NumTrails, file_out); + trail_point_count = 0; + trail_count = 0; + /* count the number of total track points */ + track_disp_all(lowranceusr_merge_track_hdr, lowranceusr_merge_track_tlr, NULL); + /* write out the new track header */ + trail_point_count = 0; + track_disp_all(lowranceusr_merge_track_hdr_2, NULL, lowranceusr_track_disp); + + } + else + { + + my_fwrite2(&NumTrails, file_out); + + if (global_opts.debug_level >= 1) + printf("LOWRANCE data_write: Num tracks = %d\n", NumTrails); + + if (NumTrails) + { + trail_count=0; + track_disp_all(lowranceusr_track_hdr, NULL, lowranceusr_track_disp); + } + } } ff_vecs_t lowranceusr_vecs = { ff_type_file, - FF_CAP_RW_WPT, + FF_CAP_RW_ALL, rd_init, wr_init, rd_deinit, diff --git a/maggeo.c b/maggeo.c index 3bf237cc1..719ea0aab 100644 --- a/maggeo.c +++ b/maggeo.c @@ -68,7 +68,7 @@ maggeo_wr_deinit(void) static void maggeo_read(void) { - fatal("Not implemented yet."); + fatal("Reading maggeo is not implemented yet.\n"); } /* @@ -100,6 +100,7 @@ maggeo_fmtdate(time_t t) * cleansing it of NMEA-isms and decomposing to ASCII as we go. */ static +void append(char *buf, const char *str) { char *cleansed1, *cleansed2; @@ -124,13 +125,12 @@ static void maggeo_waypt_pr(const waypoint *waypointp) { char obuf[4096]; - char dtbuf[10]; double ilon, ilat; double lon, lat; int lon_deg, lat_deg; char *shortname; char *cname = NULL; - char *ctype = NULL; + const char *ctype = NULL; char *placer = NULL; char *lfounddate = NULL; char *placeddate = NULL; @@ -215,7 +215,6 @@ strconsume(char *instr, int *eaten) const char *origstr = instr; char *s = instr; char *e = instr; - int ct; while (e && *e && *e != ',') *e++; @@ -229,7 +228,7 @@ strconsume(char *instr, int *eaten) ff_vecs_t maggeo_vecs = { ff_type_file, - FF_CAP_RW_WPT, + { ff_cap_read, ff_cap_none, ff_cap_none }, maggeo_rd_init, maggeo_wr_init, maggeo_rd_deinit, diff --git a/magnav.c b/magnav.c index 8e9370dc9..ebd432a47 100644 --- a/magnav.c +++ b/magnav.c @@ -105,7 +105,7 @@ data_read(void) char *vdata; struct tm tm; - memset (&tm, sizeof(tm), 0); + memset (&tm, 0, sizeof(tm)); wpt_tmp = waypt_new(); rec = (struct record *) pdb_rec->data; wpt_tmp->altitude = be_read32(&rec->elevation); diff --git a/magproto.c b/magproto.c index 48151b532..ec96fca44 100644 --- a/magproto.c +++ b/magproto.c @@ -35,7 +35,7 @@ int wptcmtcnt_max; static char * termread(char *ibuf, int size); static void termwrite(char *obuf, int size); -static void mag_readmsg(void); +static void mag_readmsg(gpsdata_type objective); static void mag_handon(void); static void mag_handoff(void); static void *mkshort_handle = NULL; @@ -277,7 +277,7 @@ mag_writemsg(const char * const buf) termwrite(obuf, i); if (magrxstate == mrs_handon || magrxstate == mrs_awaiting_ack) { magrxstate = mrs_awaiting_ack; - mag_readmsg(); + mag_readmsg(trkdata); if (last_rx_csum != osum) { if (debug_serial) { warning("COMM ERROR: Expected %02x, got %02x", @@ -378,7 +378,7 @@ mag_verparse(char *ibuf) #define IS_TKN(x) (strncmp(ibuf,x, sizeof(x)-1) == 0) static void -mag_readmsg(void) +mag_readmsg(gpsdata_type objective) { char ibuf[200]; int isz; @@ -445,7 +445,7 @@ retry: waypt_status_disp(waypoint_read_count, waypoint_read_count); } - switch (global_opts.objective) + switch (objective) { case wptdata: waypt_add(wpt); @@ -763,7 +763,7 @@ mag_rd_init(const char *portname) } while (!got_version) { - mag_readmsg(); + mag_readmsg(trkdata); if (current_time() > later) { fatal(MYNAME ": No acknowledgment from GPS on %s\n", portname); @@ -782,7 +782,7 @@ mag_rd_init(const char *portname) if (nukewpt) { /* The unit will send us an "end" message upon completion */ mag_writemsg("PMGNCMD,DELETE,WAYPOINT"); - mag_readmsg(); + mag_readmsg(trkdata); if (!found_done) { fatal(MYNAME ": Unexpected response to waypoint delete command.\n"); } @@ -894,7 +894,7 @@ mag_trkparse(char *trkmsg) struct tm tm; waypoint *waypt; - waypt = xcalloc(sizeof *waypt, 1); + waypt = waypt_new(); memset(&tm, 0, sizeof(tm)); @@ -915,7 +915,7 @@ mag_trkparse(char *trkmsg) dmy = dmy / 100; tm.tm_mday = dmy % 100; - waypt->creation_time = mktime(&tm) + get_tz_offset(); + waypt->creation_time = mkgmtime(&tm); waypt->centiseconds = fracsecs; if (latdir == 'S') latdeg = -latdeg; @@ -1089,7 +1089,7 @@ mag_wptparse(char *trkmsg) descr[0] = 0; icon_token[0] = 0; - waypt = xcalloc(sizeof *waypt, 1); + waypt = waypt_new(); sscanf(trkmsg,"$PMGNWPL,%lf,%c,%lf,%c,%d,%c,%[^,],%[^,]", &latdeg,&latdir, @@ -1121,58 +1121,52 @@ mag_read(void) { found_done = 0; - switch (global_opts.objective) - { - case trkdata: - if (!is_file) - mag_writemsg("PMGNCMD,TRACK,2"); - - while (!found_done) { - mag_readmsg(); - } - - break; - case wptdata: - if (!is_file) - mag_writemsg("PMGNCMD,WAYPOINT"); - - while (!found_done) { - mag_readmsg(); - } - - break; - case rtedata: - if (!is_file) { - /* - * serial routes require waypoint & routes - * messages commands. - */ - mag_writemsg("PMGNCMD,WAYPOINT"); - - while (!found_done) { - mag_readmsg(); - } - - mag_writemsg("PMGNCMD,ROUTE"); - - found_done = 0; - while (!found_done) { - mag_readmsg(); - } - } else { - /* - * SD routes are a stream of PMGNWPL and - * PMGNRTE messages, in that order. - */ - while (!found_done) { - mag_readmsg(); - } - } - - break; - default: - fatal(MYNAME ": Unknown objective\n"); - } + if (global_opts.masked_objective & TRKDATAMASK) { + if (!is_file) + mag_writemsg("PMGNCMD,TRACK,2"); + + while (!found_done) { + mag_readmsg(trkdata); + } + } + + if (global_opts.masked_objective & WPTDATAMASK) { + if (!is_file) + mag_writemsg("PMGNCMD,WAYPOINT"); + + while (!found_done) { + mag_readmsg(wptdata); + } + } + + if (global_opts.masked_objective & RTEDATAMASK) { + if (!is_file) { + /* + * serial routes require waypoint & routes + * messages commands. + */ + mag_writemsg("PMGNCMD,WAYPOINT"); + + while (!found_done) { + mag_readmsg(rtedata); + } + + mag_writemsg("PMGNCMD,ROUTE"); + + found_done = 0; + while (!found_done) { + mag_readmsg(rtedata); + } + } else { + /* + * SD routes are a stream of PMGNWPL and + * PMGNRTE messages, in that order. + */ + while (!found_done) { + mag_readmsg(rtedata); + } + } + } } static diff --git a/main.c b/main.c index 2b1afdfe4..01e0adaac 100644 --- a/main.c +++ b/main.c @@ -54,7 +54,7 @@ usage(const char *pname, int shorter) " -t Process track information\n" " -w Process waypoint information [default]\n" " -N No smart icons on output\n" -" -x filtername Invoke filter\n" +" -x filtername Invoke filter (place between inputs and output) \n" " -D level Set debug level [%d]\n" " -h, -? Print detailed help and exit\n" " -V Print GPSBabel version and exit\n" @@ -153,6 +153,9 @@ main(int argc, char *argv[]) optarg = argv[argn][2] ? argv[argn]+2 : argv[++argn]; ovecs = find_vec(optarg, &ovec_opts); + if (ovecs == NULL) { + fatal ("Output type '%s' not recognized\n", optarg); + } break; case 'f': optarg = argv[argn][2] diff --git a/mapsend.c b/mapsend.c index fa538c342..40b7e97c1 100644 --- a/mapsend.c +++ b/mapsend.c @@ -481,7 +481,7 @@ void mapsend_track_hdr(const route_head * trk) case 20: verstring = "30"; break; case 30: verstring = "34"; break; case 40: verstring = "36"; break; - default: fatal("Unknown track version."); break; + default: fatal("Unknown track version.\n"); break; } hdr.ms_version[0] = verstring[0]; diff --git a/mapsource.c b/mapsource.c index 948d76084..0ba7bd83b 100644 --- a/mapsource.c +++ b/mapsource.c @@ -101,7 +101,7 @@ le_fwrite64(void *ptr, int sz, int ct, FILE *stream) unsigned char cbuf[8]; if ((sz != 8) || (ct != 1)) { - fatal(MYNAME ": Bad internal arguments to le_fwrite64"); + fatal(MYNAME ": Bad internal arguments to le_fwrite64.\n"); } le_read64(cbuf, ptr); @@ -187,7 +187,7 @@ mps_find_desc_from_icon_number(const int icon, garmin_formats_e garmin_format) return i->icon; break; default: - fatal(MYNAME ": unknown garmin format"); + fatal(MYNAME ": unknown garmin format.\n"); } } return DEFAULTICONDESCR; @@ -221,7 +221,7 @@ mps_find_icon_number_from_desc(const char *desc, garmin_formats_e garmin_format) case GARMIN_SERIAL: return i->pcxsymnum; default: - fatal(MYNAME ": unknown garmin format"); + fatal(MYNAME ": unknown garmin format.\n"); } } } @@ -267,7 +267,7 @@ int mps_converted_icon_number(const int icon_num, const int mpsver, garmin_forma return icon_num; default: - fatal(MYNAME ": unknown garmin format"); + fatal(MYNAME ": unknown garmin format.\n"); } return def_icon; } @@ -413,7 +413,7 @@ mps_fileHeader_r(FILE *mps_file, int *mps_ver) static void mps_fileHeader_w(FILE *mps_file, int mps_ver) { - unsigned char hdr[100]; + char hdr[100]; int reclen; strcpy (hdr, "MsRc"); @@ -446,12 +446,12 @@ mps_fileHeader_w(FILE *mps_file, int mps_ver) strcpy(hdr+7,"Oct 20 1999"); strcpy(hdr+19,"12:50:33"); if (mps_ver == 4) { - hdr[1] = 0x96; /* equates to V4.06 */ + hdr[1] = (char) 0x96; /* equates to V4.06 */ strcpy(hdr+7,"Oct 22 2001"); strcpy(hdr+19,"15:45:33"); } if (mps_ver == 5) { - hdr[1] = 0xF4; /* equates to V5.0 */ + hdr[1] = (char) 0xF4; /* equates to V5.0 */ strcpy(hdr+7,"Jul 3 2003"); strcpy(hdr+19,"08:35:33"); } @@ -1802,7 +1802,7 @@ mps_read(void) fread(&reclen, 4, 1, mps_file_in); reclen = le_read32(&reclen); - if (reclen < 0) fatal (MYNAME ": a record length read from the input file is invalid. \nEither the file is corrupt or unsupported"); + if (reclen < 0) fatal (MYNAME ": a record length read from the input file is invalid. \nEither the file is corrupt or unsupported.\n"); /* Read the record type "flag" in - using fread in case in the future need more than one char */ fread(&recType, 1, 1, mps_file_in); diff --git a/mingw/Makefile b/mingw/Makefile index 0bbea79a2..3285ce2cb 100644 --- a/mingw/Makefile +++ b/mingw/Makefile @@ -1,7 +1,7 @@ CC=/usr/local/cross-tools/bin/i386-mingw32msvc-gcc VPATH=..:../shapelib -FILES=gpsbabel.exe libexpat.dll ../win32/GPSBabelGUI.exe ../README* ../COPYING +FILES=gpsbabel.exe libexpat.dll ../win32/GPSBabelGUI.exe ../README* ../style/README.style ../COPYING gpsbabel.exe: wintesto.cmd diff --git a/mingw/mkwintesto.c b/mingw/mkwintesto.c index 4a811f59a..661fcb827 100644 --- a/mingw/mkwintesto.c +++ b/mingw/mkwintesto.c @@ -244,7 +244,7 @@ int argc, } iPrevLineContinues = f_outputLine(pfTestoOut, acLineOut); if (iPrevLineContinues == 1) f_outputLine(pfTestoOut, ""); - iPrevLineContinues = f_outputLine(pfTestoOut, "IF NOT EXIST %PNAME% ECHO Can't find %PNAME%&& GOTO :EOF"); + iPrevLineContinues = f_outputLine(pfTestoOut, "IF NOT EXIST %PNAME%.EXE ECHO Can't find %PNAME%&& GOTO :EOF"); /* fputs("\r\n"); */ } /* Are we near the top of testo where the program variable is defined? */ @@ -413,6 +413,13 @@ int argc, /* skip forward to the end of the string matched (less one as the loop will add one) */ iThisChar += 8; + } else if (strncmp("${PNAME} ",acLineIn+iThisChar,9) == 0) { + strcpy(acLineOut+iTarget+iThisChar-iStart,"%PNAME% "); + /* one char shorter */ + iTarget--; + /* skip forward to the end of the string matched + (less one as the loop will add one) */ + iThisChar += 8; } else if (acLineIn[iThisChar] == '/') { acLineOut[iTarget+iThisChar-iStart] = '\\'; } else { diff --git a/mingw/wintesto.cmd b/mingw/wintesto.cmd index 0df95a78d..9afc3aeae 100644 --- a/mingw/wintesto.cmd +++ b/mingw/wintesto.cmd @@ -48,7 +48,7 @@ REM ================================== SET PNAME=.\gpsbabel -IF NOT EXIST %PNAME% ECHO Can't find %PNAME%&& GOTO :EOF +IF NOT EXIST %PNAME%.EXE ECHO Can't find %PNAME%&& GOTO :EOF @@ -132,6 +132,8 @@ REM convert lat/long. It also doesn't support description, which makes it REM awkward to test. REM DEL %TMPDIR%\lowrance1.usr +DEL %TMPDIR%\enchilada1.usr +DEL %TMPDIR%\enchilada.gpx @echo on @echo Testing... %PNAME% -i geo -f geocaching.loc -o lowranceusr -F %TMPDIR%\lowrance1.usr @@ -146,6 +148,21 @@ CALL :BINCOMPARE %TMPDIR%\lowrance1.usr reference\lowrance.usr REM And because of the FP rounding, we can't even read our file, write it back REM and get the same data. Sigh. REM bincompare reference/lowrance.usr ${TMPDIR}/lowrance1.usr +@echo on +@echo Testing... +%PNAME% -i lowranceusr -f reference\all.usr -o gpx -F %TMPDIR%\enchilada.gpx +%PNAME% -i gpx -f %TMPDIR%\enchilada.gpx -o lowranceusr -F %TMPDIR%\enchilada1.usr +@echo off +@echo. +CALL :BINCOMPARE %TMPDIR%\enchilada1.usr reference\enchilada.usr +REM Don't convert icons as waypts +@echo on +@echo Testing... +%PNAME% -i lowranceusr,ignoreicons -f reference\all.usr -o gpx -F %TMPDIR%\enchilada.gpx +%PNAME% -i gpx -f %TMPDIR%\enchilada.gpx -o lowranceusr -F %TMPDIR%\enchilada1.usr +@echo off +@echo. +CALL :BINCOMPARE %TMPDIR%\enchilada1.usr reference\ignoreicons.usr REM CSV (Comma separated value) data. @@ -1010,7 +1027,7 @@ REM @echo on @echo Testing... -%PNAME% -i geo -f geocaching.loc -o tabsep -F - | ${PNAME} -i tabsep -f - -o geo -F %TMPDIR%\tabsep.out +%PNAME% -i geo -f geocaching.loc -o tabsep -F - | %PNAME% -i tabsep -f - -o geo -F %TMPDIR%\tabsep.out %PNAME% -i geo -f geocaching.loc -o geo -F %TMPDIR%\geotabsep.out @echo off @echo. @@ -1022,7 +1039,7 @@ REM CALL :COMPARE %TMPDIR%\tabsep.out %TMPDIR%\geotabsep.out @echo on @echo Testing... -%PNAME% -i geo -f geocaching.loc -o custom -F - | ${PNAME} -i custom -f - -o geo -F %TMPDIR%\custom.out +%PNAME% -i geo -f geocaching.loc -o custom -F - | %PNAME% -i custom -f - -o geo -F %TMPDIR%\custom.out %PNAME% -i geo -f geocaching.loc -o geo -F %TMPDIR%\geocustom.out @echo off @echo. @@ -1036,3 +1053,166 @@ REM @echo off @echo. +REM +REM tef "TourExchangeFormat" read test +REM +DEL %TMPDIR%\tef_xml* +@echo on +@echo Testing... +%PNAME% -r -i tef -f reference\route\tef_xml.sample.xml -o gpx -F %TMPDIR%\tef_xml.sample.gpx +@echo off +@echo. +CALL :COMPARE reference\route\tef_xml.sample.gpx %TMPDIR%\tef_xml.sample.gpx + +REM +REM PathAway Palm Database .pdb tests +REM +DEL %TMPDIR%\pathaway* +@echo on +@echo Testing... +%PNAME% -i geo -f geocaching.loc -o pathaway,dbname=pathaway-geo -F %TMPDIR%\pathaway-geo.pdb +%PNAME% -i pathaway -f %TMPDIR%\pathaway-geo.pdb -o geo -F %TMPDIR%\pathaway-geo.loc +@echo off +@echo. +CALL :COMPARE %TMPDIR%\pathaway-geo.loc reference\pathaway-geo.loc +DEL %TMPDIR%\pathaway* +@echo on +@echo Testing... +%PNAME% -t -i pathaway -f reference\track\pathaway.pdb -o gpx -F %TMPDIR%\pathaway.gpx +@echo off +@echo. +CALL :COMPARE %TMPDIR%\pathaway.gpx reference\track\pathaway.gpx + +REM +REM Garmin GPS Database .gdb tests +REM +DEL %TMPDIR%\gdb-* +@echo on +@echo Testing... +%PNAME% -w -r -t -i gdb -f reference\gdb-sample.gdb -o gpx -F %TMPDIR%\gdb-sample.gpx +@echo off +@echo. +CALL :COMPARE reference\gdb-sample.gpx %TMPDIR%\gdb-sample.gpx +@echo on +@echo Testing... +%PNAME% -w -r -t -i gpx -f reference\gdb-sample.gpx -o gdb,ver=1 -F %TMPDIR%\gdb-sample.gdb +%PNAME% -w -r -t -i gdb -f %TMPDIR%\gdb-sample.gdb -o gpx -F %TMPDIR%\gdb-sample.gpx +@echo off +@echo. +REM +REM Because of Garmin coordinates storage gpx is not good for this test +REM compare reference/gdb-sample.gpx ${TMPDIR}/gdb-sample.gpx +REM + +REM +REM Vito Navigator II .smt tests +REM +DEL %TMPDIR%\vitosmt* +@echo on +@echo Testing... +%PNAME% -i vitosmt -f reference\vitosmt.smt -o gpx -F %TMPDIR%\vitosmt.gpx +@echo off +@echo. +CALL :COMPARE %TMPDIR%\vitosmt.gpx reference\vitosmt.gpx +@echo on +@echo Testing... +%PNAME% -t -i vitosmt -f reference\vitosmt.smt -o gpx -F %TMPDIR%\vitosmt_t.gpx +@echo off +@echo. +CALL :COMPARE %TMPDIR%\vitosmt_t.gpx reference\track\vitosmt_t.gpx + +REM +REM tracks filter tests +REM + +DEL %TMPDIR%\trackfilter* + +@echo on +@echo Testing... +%PNAME% -t -i gpx -f reference\track\trackfilter.gpx -x track,pack,split,title=LOG-%%Y%%m%%d -o gpx -F %TMPDIR%\trackfilter-new.gpx +@echo off +@echo. +CALL :COMPARE %TMPDIR%\trackfilter.ref %TMPDIR%\trackfilter.new + +REM +REM Map&Guide Motorrad Routenplaner .bcr files test +REM +DEL %TMPDIR%\bcr* +@echo on +@echo Testing... +%PNAME% -r -i bcr -f reference\route\bcr-sample.bcr -o gpx -F %TMPDIR%\bcr-sample.gpx +@echo off +@echo. +CALL :COMPARE reference\route\bcr-sample.gpx %TMPDIR%\bcr-sample.gpx +@echo on +@echo Testing... +%PNAME% -r -i gpx -f reference\route\bcr-sample.gpx -o bcr -F %TMPDIR%\bcr-sample2.bcr +@echo off +@echo. +CALL :COMPARE reference\route\bcr-sample2.bcr %TMPDIR%\bcr-sample2.bcr +@echo on +@echo Testing... +%PNAME% -r -i bcr -f %TMPDIR%\bcr-sample2.bcr -o gpx -F %TMPDIR%\bcr-sample2.gpx +@echo off +@echo. +CALL :COMPARE reference\route\bcr-sample.gpx %TMPDIR%\bcr-sample2.gpx + +REM +REM Garmin logbook. This format has an extra section (lap data with things +REM like heartbeat and calories burned) that we don't know what to do with, +REM so we convert it to gpx, convert it to itself, convert THAT to gpx, and +REM compare those. +REM +DEL %TMPDIR%\glogbook* +@echo on +@echo Testing... +%PNAME% -i glogbook -f reference\track\garmin_logbook.xml -o gpx -F %TMPDIR%\glog1.gpx +%PNAME% -i glogbook -f reference\track\garmin_logbook.xml -o glogbook -F %TMPDIR%\glog.xml +%PNAME% -i glogbook -f %TMPDIR%\glog.xml -o gpx -F %TMPDIR%\glog2.gpx +@echo off +@echo. +CALL :COMPARE %TMPDIR%\glog1.gpx %TMPDIR%\glog2.gpx + +REM +REM Dop filter test +REM +DEL %TMPDIR%\dop* +@echo on +@echo Testing... +%PNAME% -i gpx -f reference\dop-test.gpx -x discard,hdop=50 -o openoffice -F - | sed 's\RPT...\\g'> %TMPDIR%\dop-hdop.fil +@echo off +@echo. +CALL :COMPARE %TMPDIR%\dop-hdop.ref %TMPDIR%\dop-hdop.fil +@echo on +@echo Testing... +%PNAME% -i gpx -f reference\dop-test.gpx -x discard,vdop=50 -o openoffice -F - | sed 's\RPT...\\g'> %TMPDIR%\dop-vdop.fil +@echo off +@echo. +CALL :COMPARE %TMPDIR%\dop-vdop.ref %TMPDIR%\dop-vdop.fil + +REM +REM cotoGPS test +REM +DEL %TMPDIR%\coto* +REM Track reading +@echo on +@echo Testing... +%PNAME% -i coto -f reference\cototesttrack.pdb -o openoffice -F %TMPDIR%\cototrack.csv +@echo off +@echo. +CALL :COMPARE reference\cototesttrack.csv %TMPDIR%\cototrack.csv +REM Marker read/write +@echo on +@echo Testing... +%PNAME% -i coto -f reference\cototestmarker.pdb -o openoffice -F %TMPDIR%\cotomarker.csv +%PNAME% -i gpx -f reference\cototestmarker.gpx -o openoffice -F %TMPDIR%\cotomarkergpx.csv +@echo off +@echo. +CALL :COMPARE %TMPDIR%\cotomarker.csv %TMPDIR%\cotomarkergpx.csv +@echo on +@echo Testing... +%PNAME% -i gpx -f reference\cototestmarker.gpx -o coto -F %TMPDIR%\cotomarker.pdb +@echo off +@echo. +CALL :COMPARE reference\cototestmarker.pdb %TMPDIR%\cotomarker.pdb + diff --git a/mkshort.c b/mkshort.c index ce45907b8..b670d31d9 100644 --- a/mkshort.c +++ b/mkshort.c @@ -425,6 +425,9 @@ mkshort_from_wpt(void *h, const waypoint *wpt) if (wpt->notes) { return mkshort(h, wpt->notes); } + + /* Should probably never actually happen... */ + return NULL; } diff --git a/msvc/GPSBabel.dsp b/msvc/GPSBabel.dsp index 45f765dee..43b25bd20 100644 --- a/msvc/GPSBabel.dsp +++ b/msvc/GPSBabel.dsp @@ -1,746 +1,770 @@ -# Microsoft Developer Studio Project File - Name="GPSBabel" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=GPSBabel - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "GPSBabel.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "GPSBabel.mak" CFG="GPSBabel - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "GPSBabel - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "GPSBabel - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /WX /GX /O2 /I "expat" /I "..\coldsync" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__WIN32__" /D VERSION=\"1.2.1_beta01072004_msvc\" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib setupapi.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /WX /Gm /GX /ZI /Od /I "expat" /I "..\coldsync" /D "WIN32" /D "__WIN32__" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D VERSION=\"1.2.1_beta01072004_msvc\" /FR /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib setupapi.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "GPSBabel - Win32 Release" -# Name "GPSBabel - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Group "Jeeps" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\jeeps\gpsapp.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpscom.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsmath.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsmem.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsprot.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsread.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsrqst.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpssend.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsserial.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsusbread.c -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsusbsend.c -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsusbstub.c -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsusbwin.c -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsutil.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Jeeps" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Jeeps" - -!ENDIF - -# End Source File -# End Group -# Begin Group "Coldsync" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\coldsync\pdb.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Coldsync" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Coldsync" - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\coldsync\util.c - -!IF "$(CFG)" == "GPSBabel - Win32 Release" - -# PROP Intermediate_Dir "Release\Coldsync" - -!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" - -# PROP Intermediate_Dir "Debug\Coldsync" - -!ENDIF - -# End Source File -# End Group -# Begin Group "ShapeLib" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\shapelib\dbfopen.c -# End Source File -# Begin Source File - -SOURCE=..\shapelib\shpopen.c -# End Source File -# End Group -# Begin Source File - -SOURCE=..\arcdist.c -# End Source File -# Begin Source File - -SOURCE=..\brauniger_iq.c -# End Source File -# Begin Source File - -SOURCE=..\cetus.c -# End Source File -# Begin Source File - -SOURCE=..\coastexp.c -# End Source File -# Begin Source File - -SOURCE=..\copilot.c -# End Source File -# Begin Source File - -SOURCE=..\csv_util.c -# End Source File -# Begin Source File - -SOURCE=..\delgpl.c -# End Source File -# Begin Source File - -SOURCE=..\duplicate.c -# End Source File -# Begin Source File - -SOURCE=..\easygps.c -# End Source File -# Begin Source File - -SOURCE=..\filter_vecs.c -# End Source File -# Begin Source File - -SOURCE=..\garmin.c -# End Source File -# Begin Source File - -SOURCE=..\garmin_tables.c -# End Source File -# Begin Source File - -SOURCE=..\gcdb.c -# End Source File -# Begin Source File - -SOURCE=..\geo.c -# End Source File -# Begin Source File - -SOURCE=..\geoniche.c -# End Source File -# Begin Source File - -SOURCE=..\glogbook.c -# End Source File -# Begin Source File - -SOURCE=..\google.c -# End Source File -# Begin Source File - -SOURCE=..\gpilots.c -# End Source File -# Begin Source File - -SOURCE=..\gpspilot.c -# End Source File -# Begin Source File - -SOURCE=..\gpsutil.c -# End Source File -# Begin Source File - -SOURCE=..\gpx.c -# End Source File -# Begin Source File - -SOURCE=..\grtcirc.c -# End Source File -# Begin Source File - -SOURCE=..\hiketech.c -# End Source File -# Begin Source File - -SOURCE=..\holux.c -# End Source File -# Begin Source File - -SOURCE=..\hsa_ndv.c -# End Source File -# Begin Source File - -SOURCE=..\html.c -# End Source File -# Begin Source File - -SOURCE=..\igc.c -# End Source File -# Begin Source File - -SOURCE=..\internal_styles.c -# End Source File -# Begin Source File - -SOURCE=..\kml.c -# End Source File -# Begin Source File - -SOURCE=..\lowranceusr.c -# End Source File -# Begin Source File - -SOURCE=..\magnav.c -# End Source File -# Begin Source File - -SOURCE=..\magproto.c -# End Source File -# Begin Source File - -SOURCE=..\main.c -# End Source File -# Begin Source File - -SOURCE=..\mapopolis.c -# End Source File -# Begin Source File - -SOURCE=..\mapsend.c -# End Source File -# Begin Source File - -SOURCE=..\mapsource.c -# End Source File -# Begin Source File - -SOURCE=..\mkshort.c -# End Source File -# Begin Source File - -SOURCE=..\navicache.c -# End Source File -# Begin Source File - -SOURCE=..\netstumbler.c -# End Source File -# Begin Source File - -SOURCE=..\nmea.c -# End Source File -# Begin Source File - -SOURCE=..\overlay.c -# End Source File -# Begin Source File - -SOURCE=..\ozi.c -# End Source File -# Begin Source File - -SOURCE=..\palmdoc.c -# End Source File -# Begin Source File - -SOURCE=..\pcx.c -# End Source File -# Begin Source File - -SOURCE=..\polygon.c -# End Source File -# Begin Source File - -SOURCE=..\position.c -# End Source File -# Begin Source File - -SOURCE=..\psitrex.c -# End Source File -# Begin Source File - -SOURCE=..\psp.c -# End Source File -# Begin Source File - -SOURCE=..\queue.c -# End Source File -# Begin Source File - -SOURCE=..\quovadis.c -# End Source File -# Begin Source File - -SOURCE=..\reverse_route.c -# End Source File -# Begin Source File - -SOURCE=..\route.c -# End Source File -# Begin Source File - -SOURCE=..\saroute.c -# End Source File -# Begin Source File - -SOURCE=..\shape.c -# End Source File -# Begin Source File - -SOURCE=..\smplrout.c -# End Source File -# Begin Source File - -SOURCE=..\sort.c -# End Source File -# Begin Source File - -SOURCE=..\stackfilter.c -# End Source File -# Begin Source File - -SOURCE=..\text.c -# End Source File -# Begin Source File - -SOURCE=..\tiger.c -# End Source File -# Begin Source File - -SOURCE=..\tmpro.c -# End Source File -# Begin Source File - -SOURCE=..\tpg.c -# End Source File -# Begin Source File - -SOURCE=..\util.c -# End Source File -# Begin Source File - -SOURCE=..\util_crc.c -# End Source File -# Begin Source File - -SOURCE=..\uuid.c -# End Source File -# Begin Source File - -SOURCE=..\vcf.c -# End Source File -# Begin Source File - -SOURCE=..\vecs.c -# End Source File -# Begin Source File - -SOURCE=..\vmem.c -# End Source File -# Begin Source File - -SOURCE=..\waypt.c -# End Source File -# Begin Source File - -SOURCE=..\xcsv.c -# End Source File -# Begin Source File - -SOURCE=..\xmlgeneric.c -# End Source File -# Begin Source File - -SOURCE=.\Expat\libexpat.lib -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Group "Coldsync-Headers" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\coldsync\config.h -# End Source File -# Begin Source File - -SOURCE=..\coldsync\palm.h -# End Source File -# Begin Source File - -SOURCE=..\coldsync\pdb.h -# End Source File -# Begin Source File - -SOURCE=..\coldsync\pconn\util.h -# End Source File -# End Group -# Begin Group "Jeeps-Headers" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\jeeps\gps.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsapp.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpscom.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsdatum.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsfmt.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsinput.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsmath.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsmem.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsnmea.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsnmeafmt.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsnmeaget.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsport.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsproj.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsprot.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsread.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsrqst.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpssend.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsserial.h -# End Source File -# Begin Source File - -SOURCE=..\jeeps\gpsutil.h -# End Source File -# End Group -# Begin Group "ShapeLib-Headers" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\shapelib\shapefil.h -# End Source File -# End Group -# Begin Source File - -SOURCE=..\csv_util.h -# End Source File -# Begin Source File - -SOURCE=..\defs.h -# End Source File -# Begin Source File - -SOURCE=..\garmin_tables.h -# End Source File -# Begin Source File - -SOURCE=..\grtcirc.h -# End Source File -# Begin Source File - -SOURCE=..\holux.h -# End Source File -# Begin Source File - -SOURCE=..\magellan.h -# End Source File -# Begin Source File - -SOURCE=..\mapsend.h -# End Source File -# Begin Source File - -SOURCE=..\queue.h -# End Source File -# Begin Source File - -SOURCE=..\quovadis.h -# End Source File -# Begin Source File - -SOURCE=..\uuid.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="GPSBabel" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=GPSBabel - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "GPSBabel.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "GPSBabel.mak" CFG="GPSBabel - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "GPSBabel - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "GPSBabel - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /WX /GX /O2 /I "expat" /I "..\coldsync" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__WIN32__" /D VERSION=\"1.2.6_beta06232005_msvc\" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib setupapi.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /WX /Gm /GX /ZI /Od /I "expat" /I "..\coldsync" /D "WIN32" /D "__WIN32__" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D VERSION=\"1.2.6_beta06232005_msvc\" /FR /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib setupapi.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "GPSBabel - Win32 Release" +# Name "GPSBabel - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Group "Jeeps" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\jeeps\gpsapp.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpscom.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsmath.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsmem.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsprot.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsread.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsrqst.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpssend.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsserial.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsusbread.c +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsusbsend.c +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsusbstub.c +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsusbwin.c +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsutil.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Jeeps" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Jeeps" + +!ENDIF + +# End Source File +# End Group +# Begin Group "Coldsync" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\coldsync\pdb.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Coldsync" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Coldsync" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\coldsync\util.c + +!IF "$(CFG)" == "GPSBabel - Win32 Release" + +# PROP Intermediate_Dir "Release\Coldsync" + +!ELSEIF "$(CFG)" == "GPSBabel - Win32 Debug" + +# PROP Intermediate_Dir "Debug\Coldsync" + +!ENDIF + +# End Source File +# End Group +# Begin Group "ShapeLib" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\shapelib\dbfopen.c +# End Source File +# Begin Source File + +SOURCE=..\shapelib\shpopen.c +# End Source File +# End Group +# Begin Source File + +SOURCE=..\an1.c +# End Source File +# Begin Source File + +SOURCE=..\arcdist.c +# End Source File +# Begin Source File + +SOURCE=..\brauniger_iq.c +# End Source File +# Begin Source File + +SOURCE=..\cetus.c +# End Source File +# Begin Source File + +SOURCE=..\coastexp.c +# End Source File +# Begin Source File + +SOURCE=..\copilot.c +# End Source File +# Begin Source File + +SOURCE=..\csv_util.c +# End Source File +# Begin Source File + +SOURCE=..\delgpl.c +# End Source File +# Begin Source File + +SOURCE=..\duplicate.c +# End Source File +# Begin Source File + +SOURCE=..\easygps.c +# End Source File +# Begin Source File + +SOURCE=..\filter_vecs.c +# End Source File +# Begin Source File + +SOURCE=..\garmin.c +# End Source File +# Begin Source File + +SOURCE=..\garmin_tables.c +# End Source File +# Begin Source File + +SOURCE=..\gcdb.c +# End Source File +# Begin Source File + +SOURCE=..\geo.c +# End Source File +# Begin Source File + +SOURCE=..\geoniche.c +# End Source File +# Begin Source File + +SOURCE=..\glogbook.c +# End Source File +# Begin Source File + +SOURCE=..\google.c +# End Source File +# Begin Source File + +SOURCE=..\gpilots.c +# End Source File +# Begin Source File + +SOURCE=..\gpspilot.c +# End Source File +# Begin Source File + +SOURCE=..\gpsutil.c +# End Source File +# Begin Source File + +SOURCE=..\gpx.c +# End Source File +# Begin Source File + +SOURCE=..\grtcirc.c +# End Source File +# Begin Source File + +SOURCE=..\hiketech.c +# End Source File +# Begin Source File + +SOURCE=..\holux.c +# End Source File +# Begin Source File + +SOURCE=..\hsa_ndv.c +# End Source File +# Begin Source File + +SOURCE=..\html.c +# End Source File +# Begin Source File + +SOURCE=..\igc.c +# End Source File +# Begin Source File + +SOURCE=..\internal_styles.c +# End Source File +# Begin Source File + +SOURCE=..\kml.c +# End Source File +# Begin Source File + +SOURCE=..\lowranceusr.c +# End Source File +# Begin Source File + +SOURCE=..\maggeo.c +# End Source File +# Begin Source File + +SOURCE=..\magnav.c +# End Source File +# Begin Source File + +SOURCE=..\magproto.c +# End Source File +# Begin Source File + +SOURCE=..\main.c +# End Source File +# Begin Source File + +SOURCE=..\mapopolis.c +# End Source File +# Begin Source File + +SOURCE=..\mapsend.c +# End Source File +# Begin Source File + +SOURCE=..\mapsource.c +# End Source File +# Begin Source File + +SOURCE=..\mkshort.c +# End Source File +# Begin Source File + +SOURCE=..\navicache.c +# End Source File +# Begin Source File + +SOURCE=..\netstumbler.c +# End Source File +# Begin Source File + +SOURCE=..\nmea.c +# End Source File +# Begin Source File + +SOURCE=..\overlay.c +# End Source File +# Begin Source File + +SOURCE=..\ozi.c +# End Source File +# Begin Source File + +SOURCE=..\palmdoc.c +# End Source File +# Begin Source File + +SOURCE=..\pathaway.c +# End Source File +# Begin Source File + +SOURCE=..\pcx.c +# End Source File +# Begin Source File + +SOURCE=..\polygon.c +# End Source File +# Begin Source File + +SOURCE=..\position.c +# End Source File +# Begin Source File + +SOURCE=..\psitrex.c +# End Source File +# Begin Source File + +SOURCE=..\psp.c +# End Source File +# Begin Source File + +SOURCE=..\queue.c +# End Source File +# Begin Source File + +SOURCE=..\quovadis.c +# End Source File +# Begin Source File + +SOURCE=..\reverse_route.c +# End Source File +# Begin Source File + +SOURCE=..\route.c +# End Source File +# Begin Source File + +SOURCE=..\saroute.c +# End Source File +# Begin Source File + +SOURCE=..\shape.c +# End Source File +# Begin Source File + +SOURCE=..\smplrout.c +# End Source File +# Begin Source File + +SOURCE=..\sort.c +# End Source File +# Begin Source File + +SOURCE=..\stackfilter.c +# End Source File +# Begin Source File + +SOURCE=..\tef_xml.c +# End Source File +# Begin Source File + +SOURCE=..\text.c +# End Source File +# Begin Source File + +SOURCE=..\tiger.c +# End Source File +# Begin Source File + +SOURCE=..\tmpro.c +# End Source File +# Begin Source File + +SOURCE=..\tomtom.c +# End Source File +# Begin Source File + +SOURCE=..\tpg.c +# End Source File +# Begin Source File + +SOURCE=..\util.c +# End Source File +# Begin Source File + +SOURCE=..\util_crc.c +# End Source File +# Begin Source File + +SOURCE=..\uuid.c +# End Source File +# Begin Source File + +SOURCE=..\vcf.c +# End Source File +# Begin Source File + +SOURCE=..\vecs.c +# End Source File +# Begin Source File + +SOURCE=..\vitosmt.c +# End Source File +# Begin Source File + +SOURCE=..\vmem.c +# End Source File +# Begin Source File + +SOURCE=..\waypt.c +# End Source File +# Begin Source File + +SOURCE=..\xcsv.c +# End Source File +# Begin Source File + +SOURCE=..\xmlgeneric.c +# End Source File +# Begin Source File + +SOURCE=.\Expat\libexpat.lib +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Group "Coldsync-Headers" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\coldsync\config.h +# End Source File +# Begin Source File + +SOURCE=..\coldsync\palm.h +# End Source File +# Begin Source File + +SOURCE=..\coldsync\pdb.h +# End Source File +# Begin Source File + +SOURCE=..\coldsync\pconn\util.h +# End Source File +# End Group +# Begin Group "Jeeps-Headers" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\jeeps\gps.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsapp.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpscom.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsdatum.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsfmt.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsinput.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsmath.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsmem.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsnmea.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsnmeafmt.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsnmeaget.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsport.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsproj.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsprot.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsread.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsrqst.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpssend.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsserial.h +# End Source File +# Begin Source File + +SOURCE=..\jeeps\gpsutil.h +# End Source File +# End Group +# Begin Group "ShapeLib-Headers" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\shapelib\shapefil.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\csv_util.h +# End Source File +# Begin Source File + +SOURCE=..\defs.h +# End Source File +# Begin Source File + +SOURCE=..\garmin_tables.h +# End Source File +# Begin Source File + +SOURCE=..\grtcirc.h +# End Source File +# Begin Source File + +SOURCE=..\holux.h +# End Source File +# Begin Source File + +SOURCE=..\magellan.h +# End Source File +# Begin Source File + +SOURCE=..\mapsend.h +# End Source File +# Begin Source File + +SOURCE=..\queue.h +# End Source File +# Begin Source File + +SOURCE=..\quovadis.h +# End Source File +# Begin Source File + +SOURCE=..\uuid.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/msvc/mkwintesto.dsp b/msvc/mkwintesto.dsp new file mode 100644 index 000000000..41a6b3e40 --- /dev/null +++ b/msvc/mkwintesto.dsp @@ -0,0 +1,100 @@ +# Microsoft Developer Studio Project File - Name="mkwintesto" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=mkwintesto - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mkwintesto.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "mkwintesto.mak" CFG="mkwintesto - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mkwintesto - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "mkwintesto - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mkwintesto - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "mkwintesto - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "mkwintesto - Win32 Release" +# Name "mkwintesto - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\mingw\mkwintesto.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/navicache.c b/navicache.c index eb134c21f..c829b1c9c 100644 --- a/navicache.c +++ b/navicache.c @@ -40,19 +40,19 @@ arglist_t nav_args[] = { #define MY_CBUF 4096 #if NO_EXPAT -void +static void nav_rd_init(const char *fname) { fatal(MYNAME ": This build excluded GPX support because expat was not installed.\n"); } -void +static void nav_read(void) { } #else -struct +static struct nc_type_mapping{ geocache_type type; const char *name; @@ -64,7 +64,7 @@ nc_type_mapping{ { gt_event, "event" } }; -struct +static struct nc_container_mapping{ geocache_container type; const char *name; @@ -198,7 +198,7 @@ nav_end(void *data, const char *el) { } -void +static void nav_rd_init(const char *fname) { fd = xfopen(fname, "r", MYNAME); @@ -211,7 +211,7 @@ nav_rd_init(const char *fname) XML_SetElementHandler(psr, nav_start, nav_end); } -void +static void nav_read(void) { int len; @@ -230,33 +230,33 @@ nav_read(void) #endif -void +static void nav_rd_deinit(void) { fclose(fd); } -void +static void nav_wr_init(const char *fname) { fatal(MYNAME ": Does not support writing Navicache files.\n"); ofd = xfopen(fname, "w", MYNAME); } -void +static void nav_wr_deinit(void) { fclose(ofd); } -void +static void nav_write(void) { } ff_vecs_t navicache_vecs = { ff_type_file, - FF_CAP_RW_WPT, + { ff_cap_read, ff_cap_none, ff_cap_none }, nav_rd_init, nav_wr_init, nav_rd_deinit, diff --git a/netstumbler.c b/netstumbler.c index 242fdb881..554d513b2 100644 --- a/netstumbler.c +++ b/netstumbler.c @@ -74,7 +74,7 @@ data_read(void) int stealth_num = 0, whitespace_num = 0; long flags = 0; int speed = 0, channel = 0; - struct tm tm; + struct tm tm = {0}; for(; fgets(ibuf, sizeof(ibuf), file_in);) { char *field; diff --git a/nmea.c b/nmea.c index 0a6fd3d68..11515d3df 100644 --- a/nmea.c +++ b/nmea.c @@ -67,6 +67,35 @@ ' 10 300504 Date 30/05-2004 ' 11 Empty field Magnetic variation + GSA - GPS DOP and active satellites + $GPGSA,A,3,04,05,,09,12,,,24,,,,,2.5,1.3,2.1*39 + A Auto selection of 2D or 3D fix (M = manual) + 3 3D fix + 04,05... PRNs of satellites used for fix (space for 12) + 2.5 PDOP (dilution of precision) + 1.3 Horizontal dilution of precision (HDOP) + 2.1 Vertical dilution of precision (VDOP) + DOP is an indication of the effect of satellite geometry on + the accuracy of the fix. + + VTG - Track made good and ground speed + $GPVTG,054.7,T,034.4,M,005.5,N,010.2,K + 054.7,T True track made good + 034.4,M Magnetic track made good + 005.5,N Ground speed, knots + 010.2,K Ground speed, Kilometers per hour + + WPL - waypoint location + $GPWPL,4917.16,N,12310.64,W,003*65 + 4917.16,N Latitude of waypoint + 12310.64,W Longitude of waypoint + 003 Waypoint ID + When a route is active, this sentence is sent once for each + waypoint in the route, in sequence. When all waypoints have + been reported, GPR00 is sent in the next data set. In any + group of sentences, only one WPL sentence, or an R00 + sentence, will be sent. + ' The optional checksum field consists of a "*" and two hex digits repre- ' senting the exclusive OR of all characters between, but not including, @@ -93,9 +122,27 @@ static route_head *trk_head; static void *mkshort_handle; static preferred_posn_type posn_type; static time_t creation_time; +static waypoint * curr_waypt =NULL; #define MYNAME "nmea" +static const double kts2mps =0.51444444444444444; /* knots to m/s */ +static const double kmh2mps =0.27777777777777778; /* km/h to m/s */ + +static char *dogprmc = NULL; +static char *nogpgga = NULL; +static char *nogpvtg = NULL; +static char *nogpgsa = NULL; + +arglist_t nmea_args[] = { + {"gprmc", &dogprmc, "Write GPRMC sentences", NULL, ARGTYPE_BOOL }, + {"nogpgga", &nogpgga, "Don't write GPGGA sentences", NULL, ARGTYPE_BOOL }, + {"nogpvtg", &nogpvtg, "Don't write GPVTG sentences", NULL, ARGTYPE_BOOL }, + {"nogpgsa", &nogpgsa, "Don't write GPGSA sentences", NULL, ARGTYPE_BOOL }, + {0, 0, 0, 0 } +}; + + /* * Slightly different than the Magellan checksum fn. */ @@ -136,6 +183,7 @@ static void nmea_wr_deinit(void) { fclose(file_out); + mkshort_del_handle(mkshort_handle); } void @@ -178,6 +226,7 @@ gpgll_parse(char *ibuf) if (lngdir == 'W') lngdeg = -lngdeg; waypt->longitude = ddmm2degrees(lngdeg); + curr_waypt = waypt; route_add_wpt(trk_head, waypt); } @@ -187,11 +236,11 @@ gpgga_parse(char *ibuf) double latdeg, lngdeg; char lngdir, latdir; double hms; + struct tm tm; + double alt; int fix; int nsats; double hdop; - struct tm tm; - double alt; char altunits; waypoint *waypt; @@ -207,8 +256,9 @@ gpgga_parse(char *ibuf) &lngdeg,&lngdir, &fix,&nsats,&hdop,&alt,&altunits); - if (fix == 0) + if (fix == 0) { return; + } tm.tm_sec = (long) hms % 100; hms = hms / 100; @@ -227,8 +277,23 @@ gpgga_parse(char *ibuf) waypt->longitude = ddmm2degrees(lngdeg); waypt->altitude = alt; + + waypt->sat = nsats; + + waypt->hdop = hdop; + + if (fix==1) { + waypt->fix = (nsats>3)?(fix_3d):(fix_2d); + } + else if (fix==2) + { + waypt->fix = fix_dgps; + } + + curr_waypt = waypt; route_add_wpt(trk_head, waypt); + } static void @@ -237,10 +302,10 @@ gprmc_parse(char *ibuf) double latdeg, lngdeg; char lngdir, latdir; double hms; - double speed, course; char fix; unsigned int dmy; struct tm tm; + double speed,course; waypoint *waypt; if (trk_head == NULL) { @@ -254,9 +319,7 @@ gprmc_parse(char *ibuf) &hms, &fix, &latdeg, &latdir, &lngdeg, &lngdir, &speed, &course, &dmy); - - if (fix != 'A') - return; + tm.tm_sec = (long) hms % 100; hms = hms / 100; tm.tm_min = (long) hms % 100; @@ -268,12 +331,25 @@ gprmc_parse(char *ibuf) tm.tm_mon = dmy % 100 - 1; dmy = dmy / 100; tm.tm_mday = dmy; - creation_time = mktime(&tm) + get_tz_offset(); - - if (posn_type == gpgga) + creation_time = mkgmtime(&tm); + + if (posn_type == gpgga) { + /* capture useful data update and exit */ + if (curr_waypt) { + if (curr_waypt->speed<=0) + curr_waypt->speed = speed*kts2mps; + if (curr_waypt->course<=0) + curr_waypt->course = course; + } return; - + } + waypt = waypt_new(); + + waypt->speed = speed*kts2mps; + + waypt->course = course; + waypt->creation_time = creation_time; if (latdir == 'S') latdeg = -latdeg; @@ -282,6 +358,7 @@ gprmc_parse(char *ibuf) if (lngdir == 'W') lngdeg = -lngdeg; waypt->longitude = ddmm2degrees(lngdeg); + curr_waypt = waypt; route_add_wpt(trk_head, waypt); } @@ -307,6 +384,7 @@ gpwpl_parse(char *ibuf) waypt->shortname = xstrdup(sname); + curr_waypt = NULL; /* waypoints won't be updated with GPS fixes */ waypt_add(waypt); } @@ -327,9 +405,87 @@ gpzda_parse(char *ibuf) tm.tm_mday = dd; tm.tm_mon = mm - 1; tm.tm_year = yy - 1900; - creation_time = mktime(&tm) + get_tz_offset(); + creation_time = mkgmtime(&tm); +} + +static void +gpgsa_parse(char *ibuf) +{ + char fixauto; + char fix; + int prn[12]; + int scn,cnt; + float pdop=0,hdop=0,vdop=0; + char* tok=0; + + memset(prn,0xff,sizeof(prn)); + + scn = sscanf(ibuf,"$GPGSA,%c,%c,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", + &fixauto, &fix, + &prn[0],&prn[1],&prn[2],&prn[3],&prn[4],&prn[5], + &prn[6],&prn[7],&prn[8],&prn[9],&prn[10],&prn[11]); + + /* + sscanf has scanned all the leftmost elements + we'll rescan by skipping 15 commas to the dops + */ + tok = ibuf; + for (cnt=0;(tok)&&(cnt<15);cnt++) + { + tok = strchr(tok,','); + if (!tok) break; + tok++; + } + if (tok) sscanf(tok,"%f,%f,%f",&pdop,&hdop,&vdop); + + + if (curr_waypt) { + + if (curr_waypt->fix!=fix_dgps) { + if (fix=='3') curr_waypt->fix=fix_3d; + else if (fix=='2') curr_waypt->fix=fix_2d; + } + + curr_waypt->pdop = pdop; + curr_waypt->hdop = hdop; + curr_waypt->vdop = vdop; + + if (curr_waypt->sat <= 0) { + for (cnt=0;cnt<12;cnt++) + curr_waypt->sat += (prn[cnt]>0)?(1):(0); + } + } + +} + +static void +gpvtg_parse(char *ibuf) +{ + float course; + char ct; + float magcourse; + char cm; + double speed_n; + char cn; + double speed_k; + char ck; + + sscanf(ibuf,"$GPVTG,%f,%c,%f,%c,%lf,%c,%lf,%c", + &course,&ct,&magcourse,&cm,&speed_n,&cn,&speed_k,&ck); + + if (curr_waypt) { + curr_waypt->course = course; + + if (speed_k>0) + curr_waypt->speed = speed_k*kmh2mps; + else + curr_waypt->speed = speed_n*kts2mps; + + } + } + static void nmea_read(void) { @@ -338,7 +494,9 @@ nmea_read(void) int ckval, ckcmp; struct tm tm; - creation_time = mktime(&tm) + get_tz_offset() + current_time(); + creation_time = mkgmtime(&tm) + current_time(); + + curr_waypt = NULL; while (fgets(ibuf, sizeof(ibuf), file_in)) { ck = strrchr(ibuf, '*'); @@ -380,10 +538,17 @@ nmea_read(void) } else if (0 == strncmp(ibuf, "$GPZDA,",7)) { gpzda_parse(ibuf); + } else + if (0 == strncmp(ibuf, "$GPVTG,",7)) { + gpvtg_parse(ibuf); /* speed and course */ + } else + if (0 == strncmp(ibuf, "$GPGSA,",7)) { + gpgsa_parse(ibuf); /* GPS fix */ } } } + static void nmea_wayptpr(const waypoint *wpt) { @@ -412,6 +577,7 @@ void nmea_trackpt_pr(const waypoint *wpt) { char obuf[200]; + char fix='0'; double lat,lon; int cksum; struct tm *tm; @@ -428,14 +594,76 @@ nmea_trackpt_pr(const waypoint *wpt) hms = 0; } - snprintf(obuf, sizeof(obuf), "GPGGA,%06d,%08.3f,%c,%09.3f,%c,04,0,0,%.3f,M,0.0,M,,", - hms, - fabs(lat), lat < 0 ? 'S' : 'N', - fabs(lon), lon < 0 ? 'W' : 'E', - wpt->altitude == unknown_alt ? 0 : wpt->altitude); + switch (wpt->fix) + { + case fix_dgps: + fix='2'; + /* or */ + case fix_3d: + case fix_2d: + fix='1'; + break; + default: + fix='0'; + } - cksum = nmea_cksum(obuf); - fprintf(file_out, "$%s*%02X\n", obuf, cksum); + if (dogprmc) { + snprintf(obuf, sizeof(obuf), "GPRMC,%06d,%c,%08.3f,%c,%09.3f,%c,%.2f,%.2f,%06d,,", + hms, + fix=='0' ? 'V' : 'A', + fabs(lat), lat < 0 ? 'S' : 'N', + fabs(lon), lon < 0 ? 'W' : 'E', + (wpt->speed>0)?(wpt->speed / kts2mps):(0), + (wpt->course>=0)?(wpt->course):(0), + tm->tm_mday*10000+(tm->tm_mon+1)*100+tm->tm_year); + cksum = nmea_cksum(obuf); + fprintf(file_out, "$%s*%02X\n", obuf, cksum); + } + if (!nogpgga) { + snprintf(obuf, sizeof(obuf), "GPGGA,%06d,%08.3f,%c,%09.3f,%c,%c,%02d,%.1f,%.3f,M,0.0,M,,", + hms, + fabs(lat), lat < 0 ? 'S' : 'N', + fabs(lon), lon < 0 ? 'W' : 'E', + fix, + (wpt->sat>0)?(wpt->sat):(0), + (wpt->hdop>0)?(wpt->hdop):(0.0), + wpt->altitude == unknown_alt ? 0 : wpt->altitude); + cksum = nmea_cksum(obuf); + fprintf(file_out, "$%s*%02X\n", obuf, cksum); + } + if ((!nogpvtg) && ((wpt->course>=0) || (wpt->speed>0))) { + snprintf(obuf,sizeof(obuf),"GPVTG,%.3f,T,0,M,%.3f,N,%.3f,K", + (wpt->course>=0)?(wpt->course):(0), + (wpt->speed>0)?(wpt->speed / kts2mps):(0), + (wpt->speed>0)?(wpt->speed / kmh2mps):(0) ); + + cksum = nmea_cksum(obuf); + fprintf(file_out, "$%s*%02X\n", obuf, cksum); + } + + if ((!nogpgsa) && (wpt->fix!=fix_unknown)) { + + switch (wpt->fix) + { + case fix_dgps: + /* or */ + case fix_3d: + fix='3'; + break; + case fix_2d: + fix='2'; + break; + default: + fix=0; + } + snprintf(obuf,sizeof(obuf),"GPGSA,A,%c,,,,,,,,,,,,,%.1f,%.1f,%.1f", + fix, + (wpt->pdop>0)?(wpt->pdop):(0), + (wpt->hdop>0)?(wpt->hdop):(0), + (wpt->vdop>0)?(wpt->vdop):(0) ); + cksum = nmea_cksum(obuf); + fprintf(file_out, "$%s*%02X\n", obuf, cksum); + } } static void @@ -455,5 +683,5 @@ ff_vecs_t nmea_vecs = { nmea_read, nmea_write, NULL, - NULL + nmea_args }; diff --git a/overlay.c b/overlay.c index aac9e5cf3..b6b69518b 100644 --- a/overlay.c +++ b/overlay.c @@ -149,6 +149,7 @@ static int isKeyword(char *str,char **keys) /*----------------------------------------------*/ +static void ovl_rd_init(char const *fname) { fpin = xfopen(fname, "rt", MYNAME); @@ -167,7 +168,7 @@ static struct _group { } *groups; static int groups_cnt; -void ovl_add_group(int aktgrp,char *akttxt) +static void ovl_add_group(int aktgrp,char *akttxt) { int i; @@ -187,7 +188,7 @@ void ovl_add_group(int aktgrp,char *akttxt) /* The name of route is stored in a 'Text'-symbol with identical 'Group'-number. */ -void route_add_name(const route_head *hd) +static void route_add_name(const route_head *hd) { int grp; int i; @@ -211,7 +212,7 @@ void route_add_name(const route_head *hd) strcpy(route->rte_name,name); } -void ovl_read(void) +static void ovl_read(void) { char line[MAXLINE]; int isSection; @@ -391,7 +392,7 @@ void ovl_read(void) xfree(groups); } -void ovl_rd_deinit(void) +static void ovl_rd_deinit(void) { fclose(fpin); } @@ -440,7 +441,7 @@ void ovl_read_parameter(char *fname) } } -void ovl_wr_init(const char *fname) +static void ovl_wr_init(const char *fname) { fpout = xfopen(fname, "wt", MYNAME); govl_sum_n = 0.0; @@ -489,7 +490,7 @@ void ovl_wr_init(const char *fname) } } -void ovl_wr_deinit(void) +static void ovl_wr_deinit(void) { fprintf(fpout,"[Overlay]\n"); fprintf(fpout,"Symbols=%d\n",govl_symbol_cnt); @@ -512,7 +513,7 @@ void ovl_wr_deinit(void) fclose(fpout); } -void symbol_init(const route_head *hd) +static void symbol_init(const route_head *hd) { fprintf(fpout,"[Symbol %d]\n",govl_symbol_cnt+1); fprintf(fpout,"Typ=3\n"); // Linie @@ -527,7 +528,7 @@ void symbol_init(const route_head *hd) govl_group_cnt++; } -void symbol_text(double east,double north,char *text,int group) +static void symbol_text(double east,double north,char *text,int group) { fprintf(fpout,"[Symbol %d]\n",govl_symbol_cnt+1); fprintf(fpout,"Typ=2\n"); // Text @@ -544,7 +545,7 @@ void symbol_text(double east,double north,char *text,int group) govl_symbol_cnt++; } -void symbol_point(const waypoint *wpt) +static void symbol_point(const waypoint *wpt) { double east,north; @@ -563,7 +564,7 @@ void symbol_point(const waypoint *wpt) } -void symbol_deinit(const route_head *hd) +static void symbol_deinit(const route_head *hd) { queue *elem, *tmp; waypoint *waypointp; @@ -670,7 +671,7 @@ static void overlay_waypt_pr(const waypoint *waypointp) } -void ovl_write(void) +static void ovl_write(void) { waypt_disp_all(overlay_waypt_pr); track_disp_all(symbol_init, symbol_deinit, symbol_point); diff --git a/palmdoc.c b/palmdoc.c index 5e82f5aea..8a5054645 100644 --- a/palmdoc.c +++ b/palmdoc.c @@ -290,7 +290,7 @@ static void write_bookmarks( void ) { bookmark_tail = oldmark->next; be_write32( &rec.offset, oldmark->offset ); - memset( rec.text, 16, 0 ); + memset( rec.text, 0, 16 ); strncpy( rec.text, oldmark->text, 16 ); opdb_rec = new_Record( 0, 0, ct++, @@ -357,7 +357,7 @@ static void docprintf( int maxlen, char *format, ... ) { partlen = BUFFER_SIZE-1-buf.len; if ( buf.len + newlen + 1 > BUFFER_SIZE ) { - strncpy( buf.data+buf.len, txt2, partlen ); + strncpy( (char *) buf.data+buf.len, txt2, partlen ); buf.data[BUFFER_SIZE-1] = '\0'; txt2 += partlen; newlen -= partlen; @@ -366,7 +366,7 @@ static void docprintf( int maxlen, char *format, ... ) { NEW_BUFFER( &buf ); } else { - strcpy( buf.data+buf.len, txt2 ); + strcpy( (char *) buf.data+buf.len, txt2 ); buf.len += newlen; txt2 = NULL; } @@ -419,6 +419,7 @@ palmdoc_disp(const waypoint *wpt) double utme, utmn; char utmzc; char *bm; + fs_xml *fs_gpx = NULL; char bookmarktext[17]; @@ -482,9 +483,14 @@ palmdoc_disp(const waypoint *wpt) else if (wpt->notes && (!wpt->description || strcmp(wpt->notes,wpt->description))) { docprintf (10+strlen(wpt->notes), "%s\n", wpt->notes); } - - if ( includelogs && wpt->gpx_extras ) { - xml_tag *root = wpt->gpx_extras; + + fs_gpx = NULL; + if ( includelogs ) { + fs_gpx = (fs_xml *)fs_chain_find( wpt->fs, FS_GPX); + } + + if ( fs_gpx && fs_gpx->tag ) { + xml_tag *root = fs_gpx->tag; xml_tag *curlog = NULL; xml_tag *logpart = NULL; curlog = xml_findfirst( root, "groundspeak:log" ); diff --git a/pathaway.c b/pathaway.c index e3af37279..ab85b0cf2 100644 --- a/pathaway.c +++ b/pathaway.c @@ -18,16 +18,21 @@ */ -/* ToDo: - --- date format for read database -- +/* + remarks: + + The german release 3.0 of PathAway violates the PathAway standards: + * N.. .... O.. .... instead of N.. .... E.. .... + * date is formatted in DDMMYYYY instead of YYYYMMDD */ +#include #include "defs.h" #include "coldsync/palm.h" #include "coldsync/pdb.h" #include "csv_util.h" -#define MYNAME "PathAway pdb" +#define MYNAME "pathaway" #define PPDB_MAGIC_TRK 0x55735472 /* UsTr */ #define PPDB_MAGIC_WPT 0x506f4c69 /* PoLi */ @@ -36,7 +41,9 @@ FILE *fd_in, *fd_out; struct pdb *pdb_in, *pdb_out; char *fname_in, *fname_out; +static void *mkshort_handle; static gpsdata_type ppdb_type; +unsigned char german_release = 0; typedef struct ppdb_appdata { @@ -50,16 +57,16 @@ typedef struct ppdb_appdata #define PPDB_APPINFO_SIZE sizeof(struct ppdb_appdata) -static char *date_fmt = NULL; static char *dbname = NULL; static char *deficon = NULL; +static char *snlen_opt = NULL; static arglist_t ppdb_args[] = { {"dbname", &dbname, "Database name", NULL, ARGTYPE_STRING}, {"deficon", &deficon, "Default icon name", NULL, ARGTYPE_STRING}, -/* {"dtfmt", &date_fmt, "Date format", NULL, ARGTYPE_STRING }, ToDo */ - {0, 0, 0, 0 } + {"snlen", &snlen_opt, "Length of generated shortnames", NULL, ARGTYPE_INT }, + {0, 0, 0, 0, 0 } }; static void @@ -68,12 +75,38 @@ is_fatal(int is, const char *msg, ... ) if (is) fatal(MYNAME ": %s\n", msg); } +#define PPDB_DEBUG 1 + +#if PPDB_DEBUG +static void +internal_debug1(const char *filename, int fileline) +{ + static int ct=1; + printf("DBG(%d): file %s, line %d: ", ct++, filename, fileline); +} +static void +internal_debug2(const char *format, ... ) +{ + va_list args; + + va_start(args, format); + vprintf(format, args); + puts(""); + va_end(args); +} +#define DBG internal_debug1(__FILE__, __LINE__);internal_debug2 +#else +#define DBG # ; +#endif + + #define CHECK_INP(i, j) is_fatal((i != j), "Error in data structure.") /* * utilities */ +static char *ppdb_strcat(char *dest, char *src, char *def, int *size) { int len; @@ -101,10 +134,11 @@ char *ppdb_strcat(char *dest, char *src, char *def, int *size) #define STR_POOL_SIZE 16 /* !!! any power of 2 !!! */ -static char *str_pool[STR_POOL_SIZE] = {}; -static size_t str_pool_s[STR_POOL_SIZE] = {}; +static char *str_pool[STR_POOL_SIZE]; +static size_t str_pool_s[STR_POOL_SIZE]; static int str_poolp = -1; +static void str_pool_init(void) { int i; @@ -115,6 +149,7 @@ void str_pool_init(void) } } +static void str_pool_deinit(void) { int i; @@ -128,6 +163,7 @@ void str_pool_deinit(void) } } +static char *str_pool_get(size_t size) { char *tmp; @@ -148,6 +184,7 @@ char *str_pool_get(size_t size) return tmp; } +static char *str_pool_getcpy(char *src, char *def) { char *res; @@ -167,10 +204,11 @@ char *str_pool_getcpy(char *src, char *def) * decoding/formatting functions */ +static char *ppdb_fmt_float(const double val) { - char *c; char *str = str_pool_get(32); + char *c; snprintf(str, 32, "%.8f", val); c = str + strlen(str) - 1; while ((c > str) && (*c == '0')) @@ -187,14 +225,16 @@ char *ppdb_fmt_float(const double val) return str; } +static char *ppdb_fmt_degrees(char dir, double val) { - char *tmp; char *str = str_pool_get(32); - int deg = abs(val); + int deg = fabs(val); double min = 60.0 * (fabs(val) - deg); int power = 0; double fx = min; + char *tmp; + while (fx > 1.0) { fx = fx / 10.0; @@ -218,6 +258,7 @@ char *ppdb_fmt_degrees(char dir, double val) return str; } +static double ppdb_decode_coord(const char *str) { double val; @@ -231,7 +272,11 @@ double ppdb_decode_coord(const char *str) } else { - char *tmp = strchr(str, ' '); + char *tmp; + + if (*str == 'O') german_release = 1; + + tmp = strchr(str, ' '); if ((tmp) && (tmp - str < 4)) { CHECK_INP(3, sscanf(str,"%c%d %lf", &dir, °, &val)); @@ -247,12 +292,13 @@ double ppdb_decode_coord(const char *str) return val; } +static int ppdb_decode_tm(char *str, struct tm *tm) { - int i = 3; - int msec, d1, d2, d3, d4, year; + int msec, d1, d2, d3, d4; time_t tnow; struct tm now; + int year; if (*str == '\0') return 0; /* empty date and time */ @@ -276,10 +322,12 @@ int ppdb_decode_tm(char *str, struct tm *tm) year = (d1 * 100) + d2; + /* the coordinates comes before date and time in + the dataset, so the flag "german_release" is set yet. */ + /* next code works for most, except for 19. and 20. of month */ - /* for trouble use input date format - !!! ToDo !!! */ - if ((year < 1980) || (year > now.tm_year)) /* YYYYMMDD or DDMMYYY ????? */ + if ((german_release != 0) || (year < 1980) || (year > now.tm_year)) /* YYYYMMDD or DDMMYYY ????? */ { tm->tm_year = (d3 * 100) + d4; tm->tm_mon = d2; @@ -291,25 +339,25 @@ int ppdb_decode_tm(char *str, struct tm *tm) tm->tm_mon = d3; tm->tm_mday = d4; } - + return 1; } -static int ppdb_read_wpt(const struct pdb *pdb_in, const struct pdb_record *pdb_rec, route_head *head) +static +int ppdb_read_wpt(const struct pdb *pdb_in, const struct pdb_record *pdb_rec, route_head *head) { - char *data, *str, *tmp; - char latdir, longdir; - int latdeg, longdeg, i; - double latval, longval, altfeet; + char *data, *str; + double altfeet; struct tm tm; for (pdb_rec = pdb_in->rec_index.rec; pdb_rec; pdb_rec=pdb_rec->next) { - int line = 0; waypoint *wpt_tmp = waypt_new(); + int line = 0; + data = (char *) pdb_rec->data; - str = csv_lineparse(data, ",", """", line++); + while (str != NULL) { switch(line) @@ -334,7 +382,7 @@ static int ppdb_read_wpt(const struct pdb *pdb_in, const struct pdb_record *pdb_ { tm.tm_year -= 1900; tm.tm_mon--; - wpt_tmp->creation_time = mktime(&tm) + get_tz_offset(); + wpt_tmp->creation_time = mkgmtime(&tm); } break; case 5: @@ -382,7 +430,7 @@ static void ppdb_rd_deinit(void) static void ppdb_read(void) { - struct pdb_record *pdb_rec; + struct pdb_record *pdb_rec = NULL; ppdb_appdata_t *info = NULL; route_head *track_head, *route_head; const char *descr = NULL; @@ -406,7 +454,7 @@ static void ppdb_read(void) { case PPDB_MAGIC_TRK: ppdb_type = trkdata; /* as default */ - if (info) + if (info != NULL) { switch(info->dataBaseSubType) { @@ -458,13 +506,29 @@ static void ppdb_read(void) static void ppdb_wr_init(const char *fname) { + int len; + fname_out = xstrdup(fname); str_pool_init(); fd_out = xfopen(fname, "wb", MYNAME); + mkshort_handle = mkshort_new_handle(); + + if (global_opts.synthesize_shortnames != 0) + { + if (snlen_opt != NULL) + len = atoi(snlen_opt); + else + len = 10; + setshort_length(mkshort_handle, len); + setshort_mustupper(mkshort_handle, 1); + setshort_badchars(mkshort_handle, ","); + setshort_whitespace_ok(mkshort_handle, 0); + } } static void ppdb_wr_deinit(void) { + mkshort_del_handle(mkshort_handle); fclose(fd_out); str_pool_deinit(); xfree(fname_out); @@ -480,13 +544,12 @@ static void ppdb_write_wpt(const waypoint *wpt) { char *buff, *tmp; char latdir, longdir; - int latdeg, longdeg, len; + int len; struct pdb_record *rec; static int ct; struct tm tm; - buff = xmalloc(REC_SIZE); - memset(buff, 0, REC_SIZE); + buff = xcalloc(REC_SIZE, 1); if (wpt->latitude < 0) latdir = 'S'; @@ -520,9 +583,17 @@ static void ppdb_write_wpt(const waypoint *wpt) } buff = ppdb_strcat(buff, ",", NULL, &len); - tmp = str_pool_getcpy(wpt->shortname, ""); - while (strchr(tmp, ',') != NULL) - *strchr(tmp, ',') = '.'; + if (global_opts.synthesize_shortnames != 0) + { + tmp = mkshort_from_wpt(mkshort_handle, wpt); + DBG("shortname %s from %s", tmp, wpt->shortname); + } + else + { + tmp = str_pool_getcpy(wpt->shortname, ""); + while (strchr(tmp, ',') != NULL) + *strchr(tmp, ',') = '.'; + } buff = ppdb_strcat(buff, tmp, "", &len); buff = ppdb_strcat(buff, ",", NULL, &len); @@ -542,7 +613,7 @@ static void ppdb_write_wpt(const waypoint *wpt) buff = ppdb_strcat(buff, tmp, "", &len); len = strlen(buff) + 1; - rec = new_Record(0, 0, ct++, len, (const ubyte *) buff); + rec = new_Record(0, 0, (udword)ct++, (uword)len, (const ubyte *) buff); if (rec == NULL) fatal(MYNAME ": libpdb couldn't create record\n"); @@ -583,8 +654,7 @@ static void ppdb_write(void) if (global_opts.objective != wptdata) /* Waypoint target do not need appinfo block */ { - appinfo = xmalloc(PPDB_APPINFO_SIZE); - memset(appinfo, 0, PPDB_APPINFO_SIZE); + appinfo = xcalloc(PPDB_APPINFO_SIZE, 1); pdb_out->appinfo = (void *)appinfo; pdb_out->appinfo_len = PPDB_APPINFO_SIZE; diff --git a/pcx.c b/pcx.c index fb4f87276..1bafae196 100644 --- a/pcx.c +++ b/pcx.c @@ -149,7 +149,7 @@ data_read(void) tm.tm_mon = month_lookup(month); tm.tm_year = atoi(date + 7) + 100; wpt_tmp = waypt_new(); - wpt_tmp->creation_time = mktime(&tm) + get_tz_offset(); + wpt_tmp->creation_time = mkgmtime(&tm); wpt_tmp->latitude = lat; wpt_tmp->longitude = lon; wpt_tmp->altitude = alt; diff --git a/psitrex.c b/psitrex.c index 89ab8dd9a..9c3da7da9 100644 --- a/psitrex.c +++ b/psitrex.c @@ -62,6 +62,7 @@ arglist_t psit_args[] = { }; /* Taken from PsiTrex 1.13 */ +static const psit_icon_mapping_t psit_icon_value_table[] = { { 0x00, "anchor" }, { 0x06, "dollar" }, @@ -144,7 +145,7 @@ const psit_icon_mapping_t psit_icon_value_table[] = { { -1, NULL } }; -const char * +static const char * psit_find_desc_from_icon_number(const int icon) { const psit_icon_mapping_t *i; @@ -157,7 +158,7 @@ psit_find_desc_from_icon_number(const int icon) return ""; } -int +static int psit_find_icon_number_from_desc(const char *desc) { const psit_icon_mapping_t *i; @@ -570,7 +571,7 @@ psit_track_r(FILE *psit_file, route_head **trk) &(tmTime.tm_sec)); tmTime.tm_isdst = 0; - dateTime = mktime(&tmTime) + get_tz_offset(); + dateTime = mkgmtime(&tmTime); psit_getToken(psit_file,psit_current_token,sizeof(psit_current_token), whitespace); diff --git a/reference/all.usr b/reference/all.usr new file mode 100644 index 0000000000000000000000000000000000000000..60931807accd7b98fed6061a0b60bad117b7a602 GIT binary patch literal 2941 zcma*pYiv|S7{>8)7HtiN7D#OQAhsq&qS7W6@e8dQq!tAXDOH3P?24;hcDqfNZKO~I zTP0ZPB`p$#-~}&~OB%q&f^rds6^t}!6hlmmXfT!lLQq5ktk3^VX1@@jADaC7&YW}R z%*-=;0-om$(qGGc<=+0w&8c2FQ-9Nf@kluKjO2CoPaZsMH1fSo_m+E?FEyt&>c8vs z_h5ZILQD5?*C*h8u0HRjnp0;~&(PoWL_8F%qgT%f*UPtuRMa;nLixpk0X}{pHx76^ z^!TLSq)0<@OC$i%(@2cvk2IF`)<43Y$QUunx=+J^+)1RbYb92}*?5z&*mtpio!}3WO!#W?>=7 z5fUIii2Y(9Fz#qb7a8xJ-KM8k%AB8)>Az>uw6K(?gg)FdF z$OK;q9$@CrYaadW!rx%4a0YA;E`iO0UA09R%vB!?!@;M*2*BFh3U&%M44THeN(tbh zW#B7e3iw8-00)ICSD6bAs1gBmwi)9so}-c!UUE&Zy2?thPfc$-d<4E!r5i9XTinlt z9aP+YvbX4?(yOK)K(}xdtP_3*?+E?iP2nWy5YB?-!g;VnNPz`{ub}vGAp_J2S>P#Q zD5w^OgU5ssV5X4onu%iTfEiAV1CF*)RJ zCrIb6UKLxKu<$>*dq_=|y9b00E+==k`s8jIl_J45#wcMi6>`@E$lZL9&RwP|mOD?l zR_^-sb`Nv;uYzr6a#u`++}#eY%pH3;izc?EC5YXaB2#;We*m-n7hwKR16JfBNav2q z5bi@-1K?}ng1gEpSIH)8WZ7hmY^W@#9U4@|b3+C;5s)%FVXl%*o^IKsv&|}R+RWvo z^+k7|S6t-{Kx{3Wz_Q74WZ7gGwgK2zmQBWNyM>{$e=M8d1G4!G=n^cO?+Vw-<_qd$ z*(4@cW^)KzH>9R)Fk2V~W(c`pmXPO~ESpcNGLURma@9h0wg9#Y7D=*cNhF)I=(Ad| z{Jt;LP+{FefW2X0x6GrmTWA2xm}L`KHkmrhCbMeUq_bs{$y~uz9M0AUv{K>Di@-Kv zKKMkibASo2rShR*2g@44-lD^yO|UU@_!t%m_BsuMO+rL?g!_brGB8)LW35K8$*dL% zX__gFau^9%lpJ@JEz>+zZluB^t_SJGWf&LPB+GY4*xe3e0E=4ydW2g5@0A01Q#+anQ3jRug8kg{C73>uPI1Vv zZB7E7ehx4&JI5HaoowFM$qD(!-8oBsgZ1@#L6 literal 0 HcmV?d00001 diff --git a/reference/coastexp.ref b/reference/coastexp.ref index 98df894e3..4c5dad94c 100644 --- a/reference/coastexp.ref +++ b/reference/coastexp.ref @@ -177,43 +177,43 @@ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/ Into The Bay - + SFBALBAY - + SFBAY001 - + SFBAY002 - + SFGGBRDG - + SFCHNL01 - + HMCOLREF - + HMPILL01 - + HMPILLPT - + HMPILL02 - + HMPILL03 diff --git a/reference/cototest.style b/reference/cototest.style new file mode 100644 index 000000000..6d167f630 --- /dev/null +++ b/reference/cototest.style @@ -0,0 +1,33 @@ +# gpsbabel XCSV style file +# +# Format: Test-style for cotoGPS +# Author: Tobias Minich +# Date: 08/01/2005 +# +# + +DESCRIPTION Test-style for cotoGPS + +# FILE LAYOUT DEFINITIIONS: +# +FIELD_DELIMITER COMMA +RECORD_DELIMITER NEWLINE + + +# +# INDIVIDUAL DATA FIELDS: +# +IFIELD LAT_DECIMAL, "", "%f" +IFIELD LON_DECIMAL, "", "%f" +IFIELD ICON_DESCR, "", "%s" +IFIELD SHORTNAME, "", "%s" +IFIELD DESCRIPTION, "", "%s" +IFIELD NOTES, "", "%s" +IFIELD ALT_METERS, "", "%.0f" +IFIELD PATH_SPEED, "", "%10.1f" +IFIELD TIMET_TIME, "", "%ld" +IFIELD GPS_HDOP, "", "%10.1f" +IFIELD GPS_VDOP, "", "%10.1f" +IFIELD GPS_PDOP, "", "%10.1f" +IFIELD GPS_SAT, "", "%d" +IFIELD GPS_FIX, "", "%s" diff --git a/reference/cototestmarker.gpx b/reference/cototestmarker.gpx new file mode 100644 index 000000000..de942e558 --- /dev/null +++ b/reference/cototestmarker.gpx @@ -0,0 +1,22 @@ + + + + + + GC2663 + GC2663 + New Orleans Bon Chance (Good Luck) Cache-Cam by CrotalusRex and Mimichan + Geocache + + + GCMK1V + GCMK1V + Randeck Maar Earthcache by Border + Earthcache + + diff --git a/reference/cototestmarker.pdb b/reference/cototestmarker.pdb new file mode 100644 index 0000000000000000000000000000000000000000..eb33c7b6bd85d9bdba5706cf1b14a61036e37e96 GIT binary patch literal 550 zcmYe!FUfZg2v+b-EXqzTa&cln2OQ`EV15FKba4!EOa|%(i+~6w1_s7rMlhH00f@uE zAkW~JU!vexT%4Jnmzn~Sa!<`qPE5{71uFv*u8Bn@87Lw!nPEaR0z(1`Fxmf9TeUJ= zcD4P3-I*T@7>wPWjm*r9kyHSgeyQaO{zW;diFw5ePWgEX&KZe$$*Bq&?)mvC3O=RD z*_sN@pg`1hPRvzEs#I_;$}dUGDJ>34tx!nJOHuI6%*{*&>S5S_)ICaBYj&0WYlXu7 nAGdsUclPx*3`4an2&f}9IUAS;5{ncN(E&2oDZeNswTJ-#`_oM^ literal 0 HcmV?d00001 diff --git a/reference/cototesttrack.csv b/reference/cototesttrack.csv new file mode 100644 index 000000000..d5aee706c --- /dev/null +++ b/reference/cototesttrack.csv @@ -0,0 +1,135 @@ +48.557327,8.961583,,RPT001,RPT001,,395, 1.9,1122371309, 0.8, 1.2, 1.5,10,3d +48.557327,8.961585,,RPT002,RPT002,,395, 0.5,1122371311, 0.8, 1.2, 1.5,9,3d +48.557353,8.961542,,RPT003,RPT003,,395, 1.2,1122371313, 0.9, 1.3, 1.6,10,3d +48.557388,8.961457,,RPT004,RPT004,,395, 3.5,1122371315, 0.9, 1.3, 1.6,9,3d +48.557395,8.961412,,RPT005,RPT005,,395, 3.7,1122371316, 0.9, 1.3, 1.6,10,3d +48.557390,8.961370,,RPT006,RPT006,,395, 3.0,1122371317, 0.8, 1.2, 1.5,10,3d +48.557360,8.961295,,RPT007,RPT007,,395, 3.3,1122371319, 0.9, 1.4, 1.7,9,3d +48.557350,8.961223,,RPT008,RPT008,,395, 2.6,1122371321, 0.8, 1.2, 1.5,10,3d +48.557385,8.961148,,RPT009,RPT009,,396, 2.4,1122371324, 1.0, 1.6, 1.9,9,3d +48.557427,8.961158,,RPT010,RPT010,,395, 1.8,1122371326, 0.8, 1.2, 1.5,10,3d +48.557473,8.961232,,RPT011,RPT011,,396, 3.2,1122371328, 0.8, 1.2, 1.5,10,3d +48.557523,8.961327,,RPT012,RPT012,,396, 4.3,1122371330, 1.0, 1.6, 1.9,9,3d +48.557547,8.961410,,RPT013,RPT013,,396, 3.0,1122371332, 0.8, 1.2, 1.5,10,3d +48.557493,8.961597,,RPT014,RPT014,,396, 5.2,1122371335, 1.2, 2.0, 2.3,9,3d +48.557405,8.961743,,RPT015,RPT015,,396, 6.8,1122371337, 0.8, 1.2, 1.5,10,3d +48.557295,8.961937,,RPT016,RPT016,,395, 8.9,1122371339, 0.8, 1.2, 1.5,10,3d +48.557295,8.961937,,RPT017,RPT017,,395, 8.9,1122371339, 0.8, 1.2, 1.5,10,3d +48.557113,8.962262,,RPT018,RPT018,,395, 10.4,1122371342, 0.8, 1.2, 1.5,10,3d +48.557050,8.962375,,RPT019,RPT019,,395, 10.8,1122371343, 0.8, 1.2, 1.5,10,3d +48.556857,8.962722,,RPT020,RPT020,,395, 11.1,1122371346, 1.2, 1.5, 1.9,7,3d +48.556725,8.962953,,RPT021,RPT021,,395, 11.3,1122371348, 1.4, 2.3, 2.7,6,3d +48.556658,8.963070,,RPT022,RPT022,,395, 11.3,1122371349, 1.4, 2.3, 2.7,6,3d +48.556522,8.963310,,RPT023,RPT023,,395, 11.3,1122371351, 1.2, 2.2, 2.5,7,3d +48.556377,8.963557,,RPT024,RPT024,,394, 11.9,1122371353, 1.2, 2.0, 2.3,8,3d +48.556212,8.963793,,RPT025,RPT025,,394, 12.4,1122371355, 1.4, 2.0, 2.5,5,3d +48.556020,8.963990,,RPT026,RPT026,,393, 13.1,1122371357, 1.3, 2.3, 2.7,6,3d +48.555918,8.964075,,RPT027,RPT027,,393, 12.8,1122371358, 1.3, 2.0, 2.4,5,3d +48.555717,8.964222,,RPT028,RPT028,,393, 12.4,1122371360, 3.9, 6.4, 7.5,4,3d +48.555523,8.964363,,RPT029,RPT029,,392, 12.2,1122371362, 30.7, 41.0, 51.3,4,2d +48.555345,8.964542,,RPT030,RPT030,,392, 11.6,1122371364, 1.0, 1.6, 1.9,9,3d +48.555177,8.964760,,RPT031,RPT031,,392, 12.5,1122371366, 1.2, 1.9, 2.3,6,3d +48.555020,8.964978,,RPT032,RPT032,,392, 12.2,1122371368, 1.4, 2.3, 2.7,7,3d +48.554947,8.965077,,RPT033,RPT033,,392, 11.0,1122371369, 1.2, 2.2, 2.5,7,3d +48.554795,8.965253,,RPT034,RPT034,,392, 10.7,1122371371, 1.4, 2.4, 2.7,6,3d +48.554627,8.965418,,RPT035,RPT035,,391, 11.3,1122371373, 1.3, 2.8, 3.1,6,3d +48.554448,8.965578,,RPT036,RPT036,,391, 11.4,1122371375, 3.2, 3.5, 4.7,4,3d +48.554302,8.965727,,RPT037,RPT037,,390, 10.7,1122371377, 1.7, 2.3, 2.9,5,3d +48.554215,8.965882,,RPT038,RPT038,,391, 8.3,1122371379, 1.2, 2.2, 2.5,7,3d +48.554243,8.966045,,RPT039,RPT039,,391, 6.5,1122371381, 1.3, 2.0, 2.4,7,3d +48.554282,8.966232,,RPT040,RPT040,,391, 6.9,1122371383, 1.5, 4.1, 4.3,5,3d +48.554318,8.966453,,RPT041,RPT041,,391, 8.4,1122371385, 1.4, 2.4, 2.7,6,3d +48.554350,8.966680,,RPT042,RPT042,,392, 8.5,1122371387, 1.4, 2.5, 2.9,6,3d +48.554378,8.966915,,RPT043,RPT043,,392, 8.8,1122371389, 1.5, 4.1, 4.3,5,3d +48.554408,8.967123,,RPT044,RPT044,,393, 8.6,1122371391, 2.1, 2.3, 3.1,5,3d +48.554463,8.967297,,RPT045,RPT045,,394, 7.3,1122371393, 1.2, 1.8, 2.2,7,3d +48.554517,8.967438,,RPT046,RPT046,,395, 6.4,1122371395, 1.2, 1.9, 2.3,7,3d +48.554565,8.967590,,RPT047,RPT047,,395, 6.0,1122371397, 1.2, 1.9, 2.2,7,3d +48.554615,8.967743,,RPT048,RPT048,,395, 6.4,1122371399, 1.4, 2.3, 2.7,6,3d +48.554700,8.967838,,RPT049,RPT049,,396, 6.1,1122371401, 1.3, 2.3, 2.7,7,3d +48.554800,8.967820,,RPT050,RPT050,,397, 5.5,1122371403, 1.2, 2.0, 2.3,8,3d +48.554897,8.967800,,RPT051,RPT051,,396, 5.5,1122371405, 2.6, 3.1, 4.1,6,3d +48.555007,8.967795,,RPT052,RPT052,,396, 5.6,1122371407, 2.4, 3.1, 3.9,6,3d +48.555125,8.967822,,RPT053,RPT053,,396, 6.5,1122371409, 2.3, 2.2, 3.1,6,3d +48.555218,8.967930,,RPT054,RPT054,,397, 6.6,1122371411, 0.9, 1.3, 1.6,8,3d +48.555298,8.968085,,RPT055,RPT055,,399, 7.2,1122371413, 2.1, 2.3, 3.1,5,3d +48.555385,8.968235,,RPT056,RPT056,,400, 7.2,1122371415, 1.2, 1.8, 2.2,7,3d +48.555455,8.968420,,RPT057,RPT057,,401, 7.5,1122371417, 1.4, 2.3, 2.7,6,3d +48.555515,8.968630,,RPT058,RPT058,,402, 8.4,1122371419, 1.4, 2.3, 2.7,6,3d +48.555562,8.968847,,RPT059,RPT059,,403, 8.5,1122371421, 1.2, 1.8, 2.2,7,3d +48.555613,8.969055,,RPT060,RPT060,,403, 8.4,1122371423, 1.2, 1.8, 2.2,7,3d +48.555665,8.969248,,RPT061,RPT061,,403, 7.9,1122371425, 1.4, 2.3, 2.7,6,3d +48.555727,8.969428,,RPT062,RPT062,,403, 7.4,1122371427, 1.4, 2.3, 2.7,6,3d +48.555790,8.969582,,RPT063,RPT063,,403, 6.8,1122371429, 1.4, 2.3, 2.7,6,3d +48.555870,8.969733,,RPT064,RPT064,,404, 6.7,1122371431, 1.1, 1.6, 2.0,8,3d +48.555958,8.969892,,RPT065,RPT065,,404, 7.5,1122371433, 0.9, 1.3, 1.6,9,3d +48.556038,8.970065,,RPT066,RPT066,,404, 7.7,1122371435, 1.3, 1.8, 2.2,7,3d +48.556113,8.970243,,RPT067,RPT067,,404, 7.8,1122371437, 1.3, 1.8, 2.2,7,3d +48.556180,8.970410,,RPT068,RPT068,,404, 7.5,1122371439, 1.4, 2.3, 2.7,6,3d +48.556238,8.970570,,RPT069,RPT069,,404, 6.8,1122371441, 0.9, 1.4, 1.7,8,3d +48.556307,8.970727,,RPT070,RPT070,,404, 6.9,1122371443, 1.3, 1.8, 2.2,7,3d +48.556397,8.970867,,RPT071,RPT071,,404, 7.2,1122371445, 1.3, 2.3, 2.7,7,3d +48.556498,8.970997,,RPT072,RPT072,,404, 7.4,1122371447, 1.5, 4.1, 4.4,5,3d +48.556607,8.971127,,RPT073,RPT073,,403, 7.6,1122371449, 1.5, 2.3, 2.7,6,3d +48.556720,8.971252,,RPT074,RPT074,,403, 7.8,1122371451, 1.3, 2.8, 3.1,6,3d +48.556835,8.971373,,RPT075,RPT075,,404, 7.8,1122371453, 1.1, 1.7, 2.0,8,3d +48.556948,8.971477,,RPT076,RPT076,,404, 7.6,1122371455, 1.1, 1.6, 2.0,8,3d +48.557075,8.971538,,RPT077,RPT077,,406, 7.2,1122371457, 1.6, 1.8, 2.4,8,3d +48.557210,8.971575,,RPT078,RPT078,,407, 7.3,1122371459, 1.2, 2.0, 2.3,8,3d +48.557345,8.971608,,RPT079,RPT079,,407, 7.7,1122371461, 1.0, 1.6, 1.9,9,3d +48.557470,8.971637,,RPT080,RPT080,,407, 7.2,1122371463, 1.1, 1.7, 2.0,8,3d +48.557538,8.971660,,RPT081,RPT081,,406, 5.4,1122371465, 1.1, 1.7, 2.0,8,3d +48.557570,8.971673,,RPT082,RPT082,,406, 2.2,1122371467, 0.9, 1.4, 1.7,9,3d +48.557622,8.971690,,RPT083,RPT083,,406, 2.5,1122371469, 1.3, 2.8, 3.1,6,3d +48.557678,8.971717,,RPT084,RPT084,,405, 3.4,1122371471, 1.5, 2.3, 2.7,6,3d +48.557730,8.971812,,RPT085,RPT085,,406, 3.9,1122371473, 1.2, 1.8, 2.2,7,3d +48.557775,8.971957,,RPT086,RPT086,,407, 5.9,1122371475, 0.9, 1.3, 1.6,9,3d +48.557828,8.972137,,RPT087,RPT087,,409, 6.8,1122371477, 1.1, 1.6, 2.0,8,3d +48.557883,8.972347,,RPT088,RPT088,,409, 8.3,1122371479, 1.0, 1.5, 1.7,8,3d +48.557937,8.972573,,RPT089,RPT089,,409, 8.7,1122371481, 1.0, 1.5, 1.8,7,3d +48.558018,8.972813,,RPT090,RPT090,,411, 9.4,1122371483, 1.3, 1.8, 2.3,7,3d +48.558095,8.973078,,RPT091,RPT091,,413, 10.5,1122371485, 1.3, 1.8, 2.3,7,3d +48.558175,8.973340,,RPT092,RPT092,,414, 10.7,1122371487, 1.3, 1.8, 2.3,7,3d +48.558255,8.973603,,RPT093,RPT093,,416, 10.6,1122371489, 1.0, 1.5, 1.7,8,3d +48.558335,8.973867,,RPT094,RPT094,,416, 10.7,1122371491, 1.3, 1.8, 2.3,7,3d +48.558420,8.974128,,RPT095,RPT095,,417, 10.6,1122371493, 1.9, 2.0, 2.7,6,3d +48.558505,8.974393,,RPT096,RPT096,,418, 10.7,1122371495, 1.5, 2.3, 2.7,6,3d +48.558592,8.974660,,RPT097,RPT097,,419, 10.9,1122371497, 1.3, 1.8, 2.3,7,3d +48.558677,8.974927,,RPT098,RPT098,,420, 10.9,1122371499, 1.3, 1.8, 2.3,7,3d +48.558772,8.975185,,RPT099,RPT099,,422, 10.8,1122371501, 0.9, 1.3, 1.6,9,3d +48.558868,8.975437,,RPT100,RPT100,,423, 10.7,1122371503, 1.3, 1.9, 2.3,6,3d +48.558970,8.975678,,RPT101,RPT101,,424, 10.6,1122371505, 1.0, 1.5, 1.8,7,3d +48.559053,8.975923,,RPT102,RPT102,,426, 10.4,1122371507, 1.2, 1.8, 2.2,6,3d +48.559093,8.976192,,RPT103,RPT103,,427, 9.6,1122371509, 1.0, 1.6, 1.9,9,3d +48.559093,8.976475,,RPT104,RPT104,,429, 10.4,1122371511, 1.0, 1.6, 1.9,9,3d +48.559070,8.976762,,RPT105,RPT105,,432, 10.6,1122371513, 0.8, 1.2, 1.5,10,3d +48.559052,8.977048,,RPT106,RPT106,,434, 10.7,1122371515, 0.9, 1.4, 1.7,9,3d +48.559067,8.977337,,RPT107,RPT107,,436, 10.6,1122371517, 0.9, 1.4, 1.7,9,3d +48.559103,8.977623,,RPT108,RPT108,,437, 10.7,1122371519, 1.2, 1.8, 2.2,7,3d +48.559152,8.977908,,RPT109,RPT109,,439, 10.7,1122371521, 1.2, 1.8, 2.2,7,3d +48.559203,8.978187,,RPT110,RPT110,,440, 10.7,1122371523, 2.3, 2.1, 3.1,6,3d +48.559275,8.978455,,RPT111,RPT111,,442, 10.8,1122371525, 1.0, 1.6, 1.9,9,3d +48.559373,8.978698,,RPT112,RPT112,,444, 10.6,1122371527, 1.0, 1.6, 1.9,9,3d +48.559490,8.978930,,RPT113,RPT113,,446, 10.6,1122371529, 0.9, 1.3, 1.6,8,3d +48.559628,8.979135,,RPT114,RPT114,,448, 10.7,1122371531, 1.0, 1.6, 1.9,9,3d +48.559780,8.979312,,RPT115,RPT115,,449, 10.6,1122371533, 1.2, 2.0, 2.3,8,3d +48.559935,8.979483,,RPT116,RPT116,,451, 10.5,1122371535, 1.0, 1.6, 1.9,9,3d +48.560095,8.979653,,RPT117,RPT117,,453, 10.7,1122371537, 1.0, 1.6, 1.9,9,3d +48.560253,8.979823,,RPT118,RPT118,,455, 10.7,1122371539, 1.0, 1.6, 1.9,9,3d +48.560413,8.979993,,RPT119,RPT119,,456, 10.8,1122371541, 1.7, 1.8, 2.4,8,3d +48.560567,8.980157,,RPT120,RPT120,,458, 10.5,1122371543, 1.7, 1.8, 2.4,8,3d +48.560713,8.980332,,RPT121,RPT121,,460, 10.3,1122371545, 1.7, 1.8, 2.4,8,3d +48.560833,8.980553,,RPT122,RPT122,,462, 10.3,1122371547, 1.2, 2.0, 2.3,8,3d +48.560907,8.980828,,RPT123,RPT123,,463, 10.8,1122371549, 2.4, 3.1, 3.9,7,3d +48.560930,8.981137,,RPT124,RPT124,,465, 11.3,1122371551, 1.2, 2.0, 2.3,8,3d +48.560932,8.981452,,RPT125,RPT125,,467, 11.5,1122371553, 1.3, 2.3, 2.7,7,3d +48.560948,8.981762,,RPT126,RPT126,,469, 11.5,1122371555, 1.3, 2.3, 2.7,7,3d +48.560988,8.982068,,RPT127,RPT127,,471, 11.5,1122371557, 1.5, 4.1, 4.4,5,3d +48.561040,8.982372,,RPT128,RPT128,,473, 11.5,1122371559, 1.2, 1.8, 2.2,6,3d +48.561098,8.982663,,RPT129,RPT129,,474, 11.3,1122371561, 1.3, 1.9, 2.3,6,3d +48.561193,8.982927,,RPT130,RPT130,,475, 11.0,1122371563, 1.1, 1.6, 2.0,8,3d +48.561270,8.983170,,RPT131,RPT131,,476, 10.4,1122371565, 0.9, 1.3, 1.6,9,3d +48.561337,8.983385,,RPT132,RPT132,,477, 8.9,1122371567, 0.8, 1.3, 1.5,9,3d +48.561395,8.983598,,RPT133,RPT133,,477, 8.6,1122371569, 0.9, 1.3, 1.6,9,3d +48.561447,8.983807,,RPT134,RPT134,,477, 8.4,1122371571, 1.1, 1.6, 2.0,8,3d +48.561483,8.983955,,RPT135,RPT135,,477, 6.6,1122371573, 1.1, 1.8, 2.1,8,3d diff --git a/reference/cototesttrack.pdb b/reference/cototesttrack.pdb new file mode 100644 index 0000000000000000000000000000000000000000..41f34d7458a87321e335e06f3d98f04178b5a7c8 GIT binary patch literal 9800 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 literal 0 HcmV?d00001 diff --git a/reference/dop-test.gpx b/reference/dop-test.gpx new file mode 100644 index 000000000..e4ec10f98 --- /dev/null +++ b/reference/dop-test.gpx @@ -0,0 +1,17 @@ + + + + + Testcase + +374.0000000.0000003d850.5000006.8000007.600000 +374.0000001.1000003d86.90000050.5000006.900000 +374.0000001.1000002d82.0000002.0000002.000000 + + + diff --git a/reference/enchilada.usr b/reference/enchilada.usr new file mode 100644 index 0000000000000000000000000000000000000000..7df3252975dcc005fcb5a1d462a8b8d3596853b3 GIT binary patch literal 2977 zcma*pe`r-@9LMoq|MwqP=nT+FmT!Ys_3Wl7B}rn7aY%gwv(;@S}BtX7G* z8I>u5_EQ8GnTo$wmRM$+6=now_(zx^sidVvHcD@w_lM4b%Si6v!fW5>Ip;j*InU=g zClLfeo_-y7mj?$gwP$+d0{tFNHmB;F=1W2MscBaZFF|3jd185R>0*24J^eRWzbWbF z6fIj$M|~2(C+hP~raf~`^?dziv^3Wy8|k(4m#EjE;3M_w(*>#1>;AdvrlKr#v{I>rsn)jpaZ7ivJr`fn1SpZK*9POXPSfxePK062TQZ^`zE@hN6nrrZ5={ zD@g`RHC2Z-^6(jfTL`J_1B-+n&?M{vb;A3gTG#|07dC=&VI7zxtOgT=m%(_U6O0j- zgJPir+#s}p5kdI3kP&-v}eY z*TM*JP#6k66AHk7Aq325zaCZiq3|czE}R4J3apxNtKg%y2}3w)hj1;}BU}$y7&n8D z1rLL!aZzOg;G$DNpWwUrN~oZ6NT>o-=7BGShN!b=jJsG$rB_%MHF@T#tfg{5cq@V* z92eb6g@O6uGSt0PqQ&gHI80@?n!W>DgyUe7@H2Q*I1SbcXTYn%@1RTg3p^(T%22pS zNPvYx0ca40fw{ufph~y~%oMHzl|oU}bQ?&jG9Jtq?gE_WKF}yU1X_fdV6iXHrvT60U?rre>=m8{OjKKh7b0{4X7x2d=k$^HtbdI zdY!vNOb)sG9FRNDf1JCtDtS`OHtFnaGM;u0C)zJY=XoirtO117 z*#yoe+mW-$FtW4Bn7vvUs@G3eHji<_ZZ$cZZwonRlb8(5=2a}+d1`Vt=LpW`V?uT| zX>vAegq*Y4rp^xF^MWHuHl5Zuo9m+r*>rw+?zIezwPD2B+^0%2O#`#Z)H$2XsXgGpwSsM#hcF(ReXc&f!?4} z!gS74CwLQM4!x~a3!cm>VGMmLg;5c11k8LP;3z+)1;P+2Tp|y|50_zFWRWZvE`V1A zZ`W+#zfob?oB?d|CjfWqrNx9FrNSh93z(KK0du$?FwY+V=6M?+p51^Hya8D1s{uQ} z$_Ne!eH9De#v70~<#ZxE1hli@{FeCcu69 zlYl$*mO_Z~X##%T^R*c7NN3q(IHAGS{gJ@HypJ(v?`-UT!#U6QLLvA;@I`+VN~jzc zO2G-?4scTN{&Py0Oy#WL{pY;kZ-aiplfXt@Lm$4KJW+*$r*5RMn5NN!cmCT2&-0x^ zCrx~?`D + + + + + + + 44.586548 + 5066 + 5066 + 5066 + Crossing + Crossing + + + 57.607200 + 5067 + 5067 + 5067 + Dot + Intersection + + + 44.826904 + 5096 + 5096 + 5096 + Dot + Dot + + + 50.594727 + 5142 + 5142 + 5142 + Dot + Dot + + + 127.711200 + 5156 + 5156 + 5156 + Dot + Intersection + + + 96.926400 + 5224 + 5224 + 5224 + Dot + Intersection + + + 82.600800 + 5229 + 5229 + 5229 + Dot + Intersection + + + 82.905600 + 5237 + 5237 + 5237 + Dot + Intersection + + + 66.696655 + 5254 + 5254 + 5254 + Dot + Dot + + + 74.627442 + 5258 + 5258 + 5258 + Dot + Dot + + + 65.254761 + 5264 + 5264 + 5264 + Dot + Dot + + + 77.419200 + 526708 + 526708 + 526708 + Dot + Intersection + + + 74.676000 + 526750 + 526750 + 526750 + Dot + Intersection + + + 78.713135 + 527614 + 527614 + 527614 + Dot + Dot + + + 78.713135 + 527631 + 527631 + 527631 + Dot + Dot + + + 68.275200 + 5278 + 5278 + 5278 + Dot + Intersection + + + 64.008000 + 5289 + 5289 + 5289 + Dot + Intersection + + + 52.997925 + 5374FIRE + 5374FIRE + 5374FIRE + Dot + Dot + + + 56.388000 + 5376 + 5376 + 5376 + Dot + Intersection + + + 56.388000 + 6006 + 600698 + 600698 + Dot + Intersection + + + 46.028564 + 6006BLUE + 6006BLUE + 6006BLUE + Dot + Dot + + + 37.616943 + 6014MEADOW + 6014MEADOW + 6014MEADOW + Dot + Dot + + + 56.388000 + 6029 + 6029 + 6029 + Dot + Intersection + + + 50.292000 + 6053 + 6053 + 6053 + Dot + Intersection + + + 25.603200 + 6066 + 6066 + 6066 + Dot + Intersection + + + 34.442400 + 6067 + 6067 + 6067 + Dot + Intersection + + + 30.480000 + 6071 + 6071 + 6071 + Dot + Intersection + + + 15.240000 + 6073 + 6073 + 6073 + Dot + Intersection + + + 37.795200 + 6084 + 6084 + 6084 + Dot + Intersection + + + 64.008000 + 6130 + 6130 + 6130 + Dot + Intersection + + + 64.008000 + 6131 + 6131 + 6131 + Dot + Intersection + + + 62.788800 + 6153 + 6153 + 6153 + Dot + Intersection + + + 55.473600 + 6171 + 6171 + 6171 + Dot + Intersection + + + 62.484000 + 6176 + 6176 + 6176 + Dot + Intersection + + + 62.179200 + 6177 + 6177 + 6177 + Dot + Intersection + + + 69.799200 + 6272 + 6272 + 6272 + Dot + Intersection + + + 73.152000 + 6272 + 6272 + 6272 + Dot + Intersection + + + 70.104000 + 6278 + 6278 + 6278 + Dot + Intersection + + + 57.564209 + 6280 + 6280 + 6280 + Dot + Dot + + + 66.696655 + 6283 + 6283 + 6283 + Dot + Dot + + + 72.945191 + 6289 + 6289 + 6289 + Dot + Dot + + + 72.847200 + 6297 + 6297 + 6297 + Dot + Intersection + + + 53.644800 + 6328 + 6328 + 6328 + Dot + Intersection + + + 43.891200 + 6354 + 6354 + 6354 + Dot + Intersection + + + 48.768000 + 635722 + 635722 + 635722 + Dot + Intersection + + + 49.072800 + 635783 + 635783 + 635783 + Dot + Intersection + + + 62.484000 + 6373 + 6373 + 6373 + Dot + Intersection + + + 3.962400 + 6634 + 6634 + 6634 + Dot + Intersection + + + 13.411200 + 6979 + 6979 + 6979 + Dot + Intersection + + + 34.012085 + 6997 + 6997 + 6997 + Dot + Dot + + + 87.782400 + BEAR HILL + BEAR HILL TOWER + Bear Hill Tower + Tall Tower + Tower + + + 23.469600 + BELLEVUE + BELLEVUE + Bellevue Parking Lot + Parking Area + Parking + + + 43.384766 + 6016 + Bike Loop Connector + Bike Loop Connector + Waypoint + Intersection + + + 89.916000 + 5236BRIDGE + Bridge + Bridge + Bridge + Bridge + + + 55.473600 + 5376BRIDGE + Bridge + Bridge + Bridge + Bridge + + + 52.730400 + 6181CROSS + Crossing + Crossing + Crossing + Crossing + + + 45.110400 + 6042CROSS + Crossing + Crossing + Crossing + Crossing + + + DARKHOLLPO + Dark Hollow Pond + Dark Hollow Pond + Fishing Area + + + 56.083200 + 6121DEAD + Dead End + Dead End + Danger Area + Dead End + + + 117.043200 + 5179DEAD + Dead End + Dead End + Danger Area + Dead End + + + 69.494400 + 5299DEAD + Dead End + Dead End + Danger Area + Dead End + + + 56.997600 + 5376DEAD + Dead End + Dead End + Danger Area + Dead End + + + 46.939200 + 6353DEAD + Dead End + Dead End + Danger Area + Dead End + + + 61.264800 + 6155DEAD + Dead End + Dead End + Danger Area + Dead End + + + 110.947200 + GATE14 + Gate 14 + Gate 14 + Truck Stop + Road + + + 77.724000 + GATE16 + Gate 16 + Gate 16 + Truck Stop + Road + + + 65.836800 + GATE17 + Gate 17 + Gate 17 + Truck Stop + Road + + + 57.302400 + GATE19 + Gate 19 + Gate 19 + Truck Stop + Road + + + 49.377600 + GATE21 + Gate 21 + Gate 21 + Truck Stop + Road + + + 81.076800 + GATE24 + Gate 24 + Gate 24 + Truck Stop + Road + + + 21.515015 + GATE5 + Gate 5 + Gate 5 + Truck Stop + Truck Stop + + + 26.561890 + GATE6 + Gate 6 + Gate 6 + Waypoint + Trail Head + + + 32.004000 + 6077LOGS + Log Crossing + Log Crossing + Amusement Park + Obstacle + + + 119.809082 + 5148NANEPA + Nanepashemet Road Crossing + Nanepashemet Road Crossing + Waypoint + Trail Head + + + 73.761600 + 5267OBSTAC + Obstacle + Obstacle + Amusement Park + Obstacle + + + 45.307495 + PANTHRCAVE + Panther Cave + Panther Cave + Tunnel + Tunnel + + + 77.992066 + 5252PURPLE + Purple Rock Hill + Purple Rock Hill + Summit + Summit + + + 67.970400 + 5287WATER + Reservoir + Reservoir + Swimming Area + Reservoir + + + 81.076800 + 5239ROAD + Road + Road + Truck Stop + Road + + + 67.360800 + 5278ROAD + Road + Road + Truck Stop + Road + + + 53.949600 + 5058ROAD + ROAD CROSSING + Road Crossing + Dot + Road Crossing + + + 69.799200 + SHEEPFOLD + Sheepfold Parking Lot + Sheepfold Parking Lot + Parking Area + Parking + + + 64.008000 + SOAPBOX + Soap Box Derby Track + Soap Box Derby Track + Cemetery + Intersection + + + 64.533692 + 5376STREAM + Stream Crossing + Stream Crossing + Bridge + Bridge + + + 61.649902 + 5144SUMMIT + Summit + Summit + Summit + Summit + + + 67.360800 + 5150TANK + WATER TANK + Water Tank + Museum + Water Tank + + + BELLEVUE + Bike Loop Bellevue + 1 + + 23.469600 + BELLEVUE + BELLEVUE + Bellevue Parking Lot + Parking Area + + + 26.561890 + GATE6 + Gate 6 + Waypoint + + + 45.307495 + PANTHRCAVE + Panther Cave + Tunnel + + + 37.616943 + 6014MEADOW + 6014MEADOW + Dot + + + 56.388000 + 6006 + 600698 + Dot + + + 46.028564 + 6006BLUE + 6006BLUE + Dot + + + 44.826904 + 5096 + 5096 + Dot + + + 44.586548 + 5066 + 5066 + Crossing + + + 57.607200 + 5067 + 5067 + Dot + + + 53.949600 + 5058ROAD + ROAD CROSSING + Road Crossing + Dot + + + 67.360800 + 5150TANK + WATER TANK + Water Tank + Museum + + + 50.594727 + 5142 + 5142 + Dot + + + 61.649902 + 5144SUMMIT + Summit + Summit + + + 127.711200 + 5156 + 5156 + Dot + + + 119.809082 + 5148NANEPA + Nanepashemet Road Crossing + Waypoint + + + 74.627442 + 5258 + 5258 + Dot + + + 77.992066 + 5252PURPLE + Purple Rock Hill + Summit + + + 78.713135 + 527631 + 527631 + Dot + + + 78.713135 + 527614 + 527614 + Dot + + + 73.761600 + 5267OBSTAC + Obstacle + Amusement Park + + + 68.275200 + 5278 + 5278 + Dot + + + 64.008000 + 5289 + 5289 + Dot + + + 52.997925 + 5374FIRE + 5374FIRE + Dot + + + 56.388000 + 5376 + 5376 + Dot + + + 64.533692 + 5376STREAM + Stream Crossing + Bridge + + + 53.644800 + 6328 + 6328 + Dot + + + 48.768000 + 635722 + 635722 + Dot + + + 49.072800 + 635783 + 635783 + Dot + + + 62.484000 + 6373 + 6373 + Dot + + + 87.782400 + BEAR HILL + BEAR HILL TOWER + Bear Hill Tower + Tall Tower + + + 72.945191 + 6289 + 6289 + Dot + + + 72.847200 + 6297 + 6297 + Dot + + + 66.696655 + 6283 + 6283 + Dot + + + 57.564209 + 6280 + 6280 + Dot + + + 62.179200 + 6177 + 6177 + Dot + + + 62.484000 + 6176 + 6176 + Dot + + + 62.788800 + 6153 + 6153 + Dot + + + 55.473600 + 6171 + 6171 + Dot + + + 64.008000 + 6131 + 6131 + Dot + + + 64.008000 + 6130 + 6130 + Dot + + + 56.388000 + 6029 + 6029 + Dot + + + 56.388000 + 6006 + 600698 + Dot + + + 37.616943 + 6014MEADOW + 6014MEADOW + Dot + + + 45.307495 + PANTHRCAVE + Panther Cave + Tunnel + + + 26.561890 + GATE6 + Gate 6 + Waypoint + + + 23.469600 + BELLEVUE + BELLEVUE + Bellevue Parking Lot + Parking Area + + + + 1 + + + 1.000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.000000 + + + + + 1.000000 + + + + + + + + + + + 2.000000 + + + 1.000000 + + + 1.000000 + + + + + 2.000000 + + + + + + + + + + + + + 6.000000 + + + 2.000000 + + + + + + + + + + + 1.000000 + + + + + + + 6.000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7.000000 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reference/fugawi.notime.txt b/reference/fugawi.notime.txt new file mode 100644 index 000000000..630eef703 --- /dev/null +++ b/reference/fugawi.notime.txt @@ -0,0 +1,19 @@ +# Latitude, Longitude and UTM coordinates are in WGS84 datum +# +# Every set of data contains the following: +# +# Waypoint name +# Waypoint comment +# Waypoint description +# Latitude in Degree and decimals (soutern hemisphere has neg. degrees) +# Longitude in degree and decimals (neg. numbers: west of Greenwich) +# Height in meters +GCEBB,Mountain Bike Heaven by susy1313,,35.9720333,-87.1347000,0.0 +GC1A37,The Troll by a182pilot & Family,,36.0906833,-86.6795500,0.0 +GC1C2B,Dive Bomber by JoGPS & family,,35.9962667,-86.6201167,0.0 +GC25A9,FOSTER by JoGPS & Family,,36.0384833,-86.6486167,0.0 +GC2723,Logan Lighthouse by JoGps & Family,,36.1121833,-86.7417667,0.0 +GC2B71,Ganier Cache by Susy1313,,36.0640833,-86.7905167,0.0 +GC309F,Shy's Hill by FireFighterEng33,,36.0877667,-86.8097333,0.0 +GC317A,GittyUp by JoGPS / Warner Parks,,36.0575000,-86.8920000,0.0 +GC317D,Inlighting by JoGPS / Warner Parks,,36.0828000,-86.8672833,0.0 diff --git a/reference/fugawi.ref b/reference/fugawi.ref new file mode 100644 index 000000000..e69de29bb diff --git a/reference/fugawi.ref.txt b/reference/fugawi.ref.txt new file mode 100644 index 000000000..7e07be768 --- /dev/null +++ b/reference/fugawi.ref.txt @@ -0,0 +1,19 @@ +# Latitude, Longitude and UTM coordinates are in WGS84 datum +# +# Every set of data contains the following: +# +# Waypoint name +# Waypoint comment +# Waypoint description +# Latitude in Degree and decimals (soutern hemisphere has neg. degrees) +# Longitude in degree and decimals (neg. numbers: west of Greenwich) +# Height in meters [optional when importing, always present when exporting: Date (GMT) as ISO YYYYMMDD, Time of the day relative to the date as HHMMSS +GCEBB,Mountain Bike Heaven by susy1313,,35.9720333,-87.1347000,0.0 ,19700101,000000 +GC1A37,The Troll by a182pilot & Family,,36.0906833,-86.6795500,0.0 ,19700101,000000 +GC1C2B,Dive Bomber by JoGPS & family,,35.9962667,-86.6201167,0.0 ,19700101,000000 +GC25A9,FOSTER by JoGPS & Family,,36.0384833,-86.6486167,0.0 ,19700101,000000 +GC2723,Logan Lighthouse by JoGps & Family,,36.1121833,-86.7417667,0.0 ,19700101,000000 +GC2B71,Ganier Cache by Susy1313,,36.0640833,-86.7905167,0.0 ,19700101,000000 +GC309F,Shy's Hill by FireFighterEng33,,36.0877667,-86.8097333,0.0 ,19700101,000000 +GC317A,GittyUp by JoGPS / Warner Parks,,36.0575000,-86.8920000,0.0 ,19700101,000000 +GC317D,Inlighting by JoGPS / Warner Parks,,36.0828000,-86.8672833,0.0 ,19700101,000000 diff --git a/reference/fugawi.time.ref.txt b/reference/fugawi.time.ref.txt new file mode 100644 index 000000000..29d630f89 --- /dev/null +++ b/reference/fugawi.time.ref.txt @@ -0,0 +1,16 @@ +# Latitude, Longitude and UTM coordinates are in WGS84 datum +# +# Every set of data contains the following: +# +# Waypoint name +# Waypoint comment +# Waypoint description +# Latitude in Degree and decimals (soutern hemisphere has neg. degrees) +# Longitude in degree and decimals (neg. numbers: west of Greenwich) +# Height in meters [optional when importing, always present when exporting: Date (GMT) as ISO YYYYMMDD, Time of the day relative to the date as HHMMSS +GCEBB,Mountain Bike Heaven by susy1313,,35.9720333,-87.1347000,0.0 ,19700101,000000 +GC1A37,The Troll by a182pilot & Family,,36.0906833,-86.6795500,0.0 ,19700101,000000 +GC1C2B,Dive Bomber by JoGPS & family,,35.9962667,-86.6201167,0.0 ,19700101,110303 +GC25A9,FOSTER by JoGPS & Family,,36.0384833,-86.6486167,0.0 ,19700101,130405 +GC2723,Logan Lighthouse by JoGps & Family,,36.1121833,-86.7417667,0.0 ,20050102,000000 +GC2B71,Ganier Cache by Susy1313,,36.0640833,-86.7905167,0.0 ,20050102,000001 diff --git a/reference/fugawi.time.txt b/reference/fugawi.time.txt new file mode 100644 index 000000000..8981db7fe --- /dev/null +++ b/reference/fugawi.time.txt @@ -0,0 +1,16 @@ +# Latitude, Longitude and UTM coordinates are in WGS84 datum +# +# Every set of data contains the following: +# +# Waypoint name +# Waypoint comment +# Waypoint description +# Latitude in Degree and decimals (soutern hemisphere has neg. degrees) +# Longitude in degree and decimals (neg. numbers: west of Greenwich) +# Height in meters [optional when importing, always present when exporting: Date (GMT) as ISO YYYYMMDD, Time of the day relative to the date as HHMMSS +GCEBB,Mountain Bike Heaven by susy1313,,35.9720333,-87.1347000,0.0 +GC1A37,The Troll by a182pilot & Family,,36.0906833,-86.6795500,0.0 ,19700101 +GC1C2B,Dive Bomber by JoGPS & family,,35.9962667,-86.6201167,0.0 ,,110304 +GC25A9,FOSTER by JoGPS & Family,,36.0384833,-86.6486167,0.0 ,19700101,130405 +GC2723,Logan Lighthouse by JoGps & Family,,36.1121833,-86.7417667,0.0 ,20050102,000000 +GC2B71,Ganier Cache by Susy1313,,36.0640833,-86.7905167,0.0 ,20050102,000001 diff --git a/reference/gc/GC7FA4.gpx b/reference/gc/GC7FA4.gpx new file mode 100644 index 000000000..a3a814d56 --- /dev/null +++ b/reference/gc/GC7FA4.gpx @@ -0,0 +1,151 @@ + + + Cache Listing Generated from Geocaching.com + This is an individual cache generated from Geocaching.com + Account "Sverdrup2" From Geocaching.com + contact@geocaching.com + http://www.geocaching.com + Geocaching - High Tech Treasure Hunting + + cache, geocache + + + + GC7FA4 + Points géodésiques du Québec by Sverdrup2, Locationless (Reverse) Cache (1/1) + http://www.geocaching.com/seek/cache_details.aspx?guid=727f9d2c-f080-41f1-a2c9-a326ead462ed + Points géodésiques du Québec + Geocache + Geocache|Locationless (Reverse) Cache + + Points géodésiques du Québec + Sverdrup2 + Sverdrup2 + Locationless (Reverse) Cache + Virtual + 1 + 1 + Canada + Quebec + LES COORDONÉES PUBLIÉES NE REPRÉSENTENT PAS LA LOCALISATION D'UNE CACHE +PUBLISHED COORDINATES DO NOT REPRESENT THE LOCALIZATION OF A CACHE + Le but de cette cache virtuelle est de trouver les points géodésiques du territoire québécois. Les points géodésiques sont faciles à identifier (capuchons de laiton au niveau du sol). Généralement, il y a un panneau de couleur orange sur un poteau à proximité du point. Sur ce panneau, le numéro du point est identifié. Aussi, la distance relative du panneau au point est indiquée. +<P> +Pour inscrire votre découverte, vous devez prendre en note le NUMÉRO DU POINT(inscrit sur le point même ou au centre du panneau)LA COORDONNÉE(en format HDDD MM.MM WGS84 datum ET UTM NAD83 indiquer la zone SVP)et L'ALTITUDE RELATIVE. Si le points n'est pas visible (il se peut qu'il soit sous quelques centimètres de terre) vous pouvez prendre la coordonnée à l'emplacement du panneau SI LA PRÉCISION DE VOTRE GPS EST SUPÉRIEUR À LA DISTANCE INSCRITE SUR LE PANNEAU (ex : Précison du GPS de 5m et distance au point inscrite sur le panneau de 3m). +<P> +Une photo du point ou du panneau et une description générale des lieux serait aussi des informations importantes. +<P> +Enfin, il faudrait aussi prendre en note l'organisme propriétaire du point géodésique. Au Québec il en existe plusieurs: +<P> +Le Service de la géodésie du Québec, Ministère des Ressources naturelles, Québec +<P> +La Division des levés géodésiques, Géomatique Canada, Secteur des sciences de la terre Ressources naturelles Canada +<P> +Le Service hydrographique du Canada, Direction des sciences, Pêches et Océans Canada et la Garde côtière canadienne, Pêches et Océans Canada +<P> +Et tout les anciens noms de ministères et/ou organisme +<P> +Des photos de points de même que des panneaux suivront bientôt. +VOUS NE POUVEZ INSCRIRE QU'UN SEUL POINT GÉODÉSIQUE (UN POINT PAR GÉOCACHEUR) +Bonne chance! + +<P> + +The goal of this virtual cache is to find the geodetic points of Québec’s territory. The geodetic points are easy to identify (Brass cap at ground level) Generally, there is an orange panel of on a post near the point. On this panel, the number of the point is identified. Also, the distance relating from the panel to the point is also indicated. In order to log your find, you must take in note THE NUMBER OF THE POINT(registered on the point or in the center of the panel) and THE COORDINATES(in format HDDD MM.MM WGS84 datum AND UTM NAD83 indicate the zone please)and THE ALTITUDE. If the point is not visible (it may be buried under few centimetres) you can take the coordinate at the panel IF THE ACCURACY OF YOUR GPS IS HIGHER Than the DISTANCE REGISTERED ON the PANEL. (Ex: accuracy of the GPS is 5m and the distance to the point registered on the panel is 3m). + <P> +A picture of the point or panel and a general description of the places would be also significant information. Finally, it would also be important to take in note the organization owner of the geodetic point. +In Quebec there are several: +<P> +The "Service de la géodésie du Québec, Ministère des Ressources naturelles Québec" +The Geodetic Survey Division, Geomatics Canada, Earth Sciences Sector, Natural Resources Canada +The Canadian Hydrographic Service, Sciences Directorate, Fisheries and Oceans Canada and the Canadian Coast Guard, Fisheries and Oceans Canada +And all old names of ministries and/or organization +<P> + +PICTURES of points and of the panels will follow soon. YOU CAN ONLY LOG ONE POINT (ONE POINT PER GEOCACHER) +Good luck! + + + + + 2005-07-12T07:00:00 + Found it + Christopher R & Pooh B + This marker is not in Quebec but it is a Geodesic marker in Clarenville, Newfoundland, Canada! + +Found this one while hunting a traditional cache and thought of this cache right away! + +It is located on Bare Mountain in Clarenville - There are aactually two markers within 15 feet of one another on Bare Mountain... + +Smiles Pooh Bear + +Ce marqueur n'est pas au Québec mais c'est un marqueur géodésique dans Clarenville, Terre-Neuve, Canada! + +A trouvé celui-ci tandis que chasse une cachette traditionnelle et pensé à cette cachette tout de suite! Elle est située sur la montagne nue dans Clarenville - il y a aactually deux marqueurs à moins de 15 pieds d'un des autres sur la montagne nue... Ours De Pooh De Sourires + + + + + + + 2005-06-26T07:00:00 + Found it + TravelBen + [:D] 14h22 + +Marqueur du Service de la Géodégie (c'est bien un "g" pas un "s") du Québec. + +Position Average (100 échantillons): +N 45° 26.872 W 075° 56.410, 21 mètres d'altitude +UTM: 18T E 582877 N 5033250 + +Ce marqueur se trouve dans le ville de Senneville, sur un monument décrivant une page d'histoire du Québec, sur le bas côté avant droit. + +Près de la cache: Exo-07 La Jumelle de Loudiver (GCP3VE) + + + + 2005-06-03T07:00:00 + Found it + etasse + MRN marker 94K4731 in Gatineau, QC. corner of Du Rhone and Gatineau Ave. + +Position Average +N 45° 29.5247 W 075° 43.0049 59.49m +UTM 18T 0443995 5037866 + +Least Squares Average +N 45° 29.5257 W 075° 43.0043 55.74m +UTM 18T 0443996 5037868 + +This pole has everything: An underground cable warning, a geodesic mark, a bus stop and a garage sale sign. + +Judging by the coordinates it looks like the coords should be 45°29'31.5" -75°43'0" I placed the GPS antenna right against the marker, to no avail. + + + + + + 2005-06-03T07:00:00 + Found it + Katou + Un bo point géodésique a Lotbinière..en allant faire une nouvelle cache a l'île richelieu ;-) + + + + + + 2005-05-29T07:00:00 + Found it + Gps_Gulliver&DauphinBleu + Point Geodesique situe near Port de Plaisance de Longueuil +sur le bord du fleuve st-laurent. +Il y a des sentiers et une grande piste cyclable +Enjoy ! + + + + + + + \ No newline at end of file diff --git a/reference/gc/GCGCA8.gpx b/reference/gc/GCGCA8.gpx new file mode 100644 index 000000000..8d4be68d0 --- /dev/null +++ b/reference/gc/GCGCA8.gpx @@ -0,0 +1,103 @@ + + + Cache Listing Generated from Geocaching.com + This is an individual cache generated from Geocaching.com + Account "robertlipe" From Geocaching.com + contact@geocaching.com + http://www.geocaching.com + Geocaching - High Tech Treasure Hunting + + cache, geocache + + + + GCGCA8 + Oozy rat in a sanitary zoo by robertlipe, Unknown Cache (3/2) + http://www.geocaching.com/seek/cache_details.aspx?guid=cda94cd6-d657-49bd-8e7e-0031ef1b2613 + Oozy rat in a sanitary zoo + Geocache + Geocache|Unknown Cache + + Oozy rat in a sanitary zoo + robertlipe + robertlipe + Unknown Cache + Not chosen + 3 + 2 + United States + Tennessee + The cache is not at the coordinates above. These coords will get you to the correct park and within 1/2 mile of the cache. The cache is within 35 feet of the trail. It is not handicapped accessible. It is a nice walk in the woods that is practical for all ages. There is no space in the container for trading items. You should bring a writing stick and bug spray is recommended. + So if the cache isn't at the above coordinates, where is it? + +<ul> + +<li>Too bad I hid a boot +<li>Too hot to hoot +<li>Never odd or even +<li>Do geese see God? +<li>"Do nine men interpret?" "Nine men," I nod +<li>Rats live on no evil star +<li>Go hang a salami, I'm a lasagna hog +</ul> + +Now that it's intuitively obvious to even the most casual observer where the cache is, turn on your geo-mojo and go find it. +<br> +<img SRC="http://www.mtgc.org/mtgc_member-banner.gif" WIDTH="500" HEIGHT="40" ALT="Member of Middle Tennessee GeoCachers Club [www.mtgc.org]" BORDER="0"></a></p> + + + + + 2005-07-03T07:00:00 + Found it + littlepod + Enjoyed the puzzle. We seemed to be about 50ft off though. TFTC. + + + 2005-04-29T07:00:00 + Write note + robertlipe + TB Drop to show he's hanging out in Nashville until we blast off for Geowoodstock in a few weeks. + + + 2005-04-18T07:00:00 + Found it + Big Bumblebee + Found it a while ago. Thanks. + + + 2005-03-27T08:00:00 + Write note + robertlipe + I had to renew my permit with the CDC and in doing so, I trolled out here verified that the infectious ooze is fully within specification and industry accepted tolerance. Ooze On! + + + 2004-12-27T08:00:00 + Found it + Virtual Babe + This was a great cache, however on this day I considered it a FIFM cache (Fun, Invigorating, Frustrating and Maddening), especially when the cache was not replaced in the proper spot by the previous cacher! Thanks anyway!! + + + + 2004-01-12T08:00:00 + Write note + robertlipe + I got a complaint from the CDC about oozy rat this weekend. I went out tonight in the dark and verified that the infectious ooze is fully within specification and industry accepted tolerance. (Although I realize now I did misstate the cache container to the reporting officer when confronted. It's, uuuuh, smaller than I said.) + + + 2003-10-04T07:00:00 + Write note + robertlipe + In the expectation that this cache will get some traffic in the next 48 hours, Ryan and I checked it earlier today. The Rat is Oozing just as we planned it. + + + 2003-07-03T07:00:00 + Write note + robertlipe + It won't earn him a smiley face, but I've confirmed that rickrich would have indeed sunk the battleship! Thanx for playing. You get a copy of the home game and some rice-a-roni... + + + + + + \ No newline at end of file diff --git a/reference/gdb-sample.gdb b/reference/gdb-sample.gdb new file mode 100644 index 0000000000000000000000000000000000000000..ea52c30b9b8de56a1d0c371ab6e9fed670c2f437 GIT binary patch literal 122965 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 + + + + + 3 + B93 + B93 + Waypoint + + + + Altenburg-Umgehung + abgu (cmt) + abgu (cmt) + abgu (notes) + Golf Course + + + + Elsterberg + Piehlerstrasse + Piehlerstrasse + Golf Course + + + + Gosel + Gosel + Gosel + Golf Course + + + + Greiz + August-Bebel-Strasse + August-Bebel-Strasse + Golf Course + + + + Jahnstrasse11 + Jahnstrasse 11 + Jahnstrasse 11 + Golf Course + + + + Liebknechtstras + Liebknechtstrasse 90 + Liebknechtstrasse 90 + Golf Course + + + + NARVA + Plauen (cmt) + Plauen (cmt) + Wir bei NARVA (notes) + Residence + + + + Völkerschlachtdenkmal + P+R Am Völkerschlachtdenkmal + P+R Am Völkerschlachtdenkmal + http://Voelkerschlachtdenkmal + Waypoint + + + NARVA-Leipzig + + + NARVA + Plauen (cmt) + Plauen (cmt) + Wir bei NARVA (notes) + Residence + + + + 416 + Fahren Sie auf die Luis-Ferdinand-Schönherr-Strasse nach Norden + Waypoint + + + + 417 + Waypoint + + + + 418 + Biegen Sie rechts ab auf die Liebknechtstrasse + Waypoint + + + + 419 + Waypoint + + + + Liebknechtstras + Liebknechtstrasse 90 + Liebknechtstrasse 90 + Golf Course + + + + 420 + Fahren Sie auf die Liebknechtstrasse nach Südosten + Waypoint + + + + 421 + Biegen Sie links ab auf die Jahnstrasse + Waypoint + + + + 422 + Waypoint + + + + Jahnstrasse11 + Jahnstrasse 11 + Jahnstrasse 11 + Golf Course + + + + 423 + Fahren Sie auf die Jahnstrasse nach Norden + Waypoint + + + + 424 + Biegen Sie links ab auf die Neundorfer Strasse + Waypoint + + + + 425 + Biegen Sie rechts ab auf die Scharnhorststrasse + Waypoint + + + + 426 + Biegen Sie rechts ab auf die Schminckestrasse + Waypoint + + + + 427 + Biegen Sie links ab auf die Kopernikusstrasse + Waypoint + + + + 428 + Waypoint + + + + 429 + Waypoint + + + + 430 + Waypoint + + + + 431 + Waypoint + + + + 432 + Ordnen Sie sich rechts ein in Richtung Talstrasse + Waypoint + + + + 433 + Waypoint + + + + 434 + Biegen Sie rechts ab auf die Zwoschwitzer Strasse + Waypoint + + + + 435 + Waypoint + + + + 436 + Waypoint + + + + 437 + Waypoint + + + + 438 + Waypoint + + + + 439 + Waypoint + + + + 440 + Waypoint + + + + 441 + Waypoint + + + + 442 + Waypoint + + + + 443 + Waypoint + + + + 444 + Biegen Sie links ab auf die An Der Schöpsdrehe + Waypoint + + + + 445 + Waypoint + + + + 446 + Waypoint + + + + 447 + Biegen Sie rechts ab auf die Elsterberger Strasse + Waypoint + + + + 448 + Waypoint + + + + 449 + Waypoint + + + + 450 + Waypoint + + + + 451 + Waypoint + + + + 452 + Waypoint + + + + 453 + Waypoint + + + + 454 + Biegen Sie rechts ab auf die Robert-Schenker-Strasse + Waypoint + + + + 455 + Biegen Sie links ab auf die Rosa-Luxemburg-Strasse + Waypoint + + + + 456 + Waypoint + + + + 457 + Waypoint + + + + 458 + Waypoint + + + + Elsterberg + Piehlerstrasse + Piehlerstrasse + Golf Course + + + + 459 + Fahren Sie auf die Piehlerstrasse nach Nordwesten + Waypoint + + + + 460 + Biegen Sie rechts ab auf die Greizer Strasse + Waypoint + + + + 461 + Waypoint + + + + 462 + Waypoint + + + + 463 + Waypoint + + + + 464 + Waypoint + + + + 465 + Waypoint + + + + 466 + Waypoint + + + + 467 + Waypoint + + + + 468 + Waypoint + + + + 469 + Waypoint + + + + 470 + Halten Sie sich rechts in Richtung Carolinenstrasse + Waypoint + + + + 471 + Biegen Sie rechts ab auf die Gartenweg + Waypoint + + + + 472 + Biegen Sie links ab auf die B94 + Waypoint + + + + 473 + Waypoint + + + + 474 + Waypoint + + + + 475 + Waypoint + + + + 476 + Waypoint + + + + 477 + Waypoint + + + + Greiz + August-Bebel-Strasse + August-Bebel-Strasse + Golf Course + + + + 478 + Fahren Sie auf die August-Bebel-Strasse nach Südosten + Waypoint + + + + 479 + Waypoint + + + + 480 + Waypoint + + + + 481 + Biegen Sie links ab auf die Werdauer Strasse + Waypoint + + + + 482 + Waypoint + + + + 483 + Waypoint + + + + 484 + Halten Sie sich rechts in Richtung Werdauer Strasse + Waypoint + + + + 485 + Waypoint + + + + 486 + Waypoint + + + + 487 + Waypoint + + + + 488 + Waypoint + + + + 489 + Waypoint + + + + 490 + Waypoint + + + + 491 + Waypoint + + + + 492 + Waypoint + + + + 493 + Waypoint + + + + 494 + Waypoint + + + + 495 + Waypoint + + + + 496 + Waypoint + + + + 497 + Waypoint + + + + 498 + Waypoint + + + + 499 + Waypoint + + + + 500 + Waypoint + + + + 501 + Waypoint + + + + 502 + Waypoint + + + + 503 + Halten Sie sich links in Richtung Marienstrasse + Waypoint + + + + 504 + Biegen Sie links ab auf die Uferstrasse + Waypoint + + + + 505 + Waypoint + + + + 506 + Waypoint + + + + 507 + Biegen Sie links ab auf die Querstrasse + Waypoint + + + + 508 + Biegen Sie rechts ab auf die Carthäuserstrasse + Waypoint + + + + 509 + Waypoint + + + + 510 + Waypoint + + + + 511 + Waypoint + + + + 512 + Waypoint + + + + 513 + Halten Sie sich links in Richtung S54 + Waypoint + + + + 514 + Waypoint + + + + 515 + Waypoint + + + + 516 + Waypoint + + + + 517 + Biegen Sie rechts ab auf die Leipziger Strasse + Waypoint + + + + 518 + Biegen Sie rechts ab auf die Leipziger Strasse + Waypoint + + + + 519 + Waypoint + + + + 520 + Biegen Sie links ab auf die Ponitzer Strasse + Waypoint + + + + 521 + Waypoint + + + + 522 + Waypoint + + + + 523 + Waypoint + + + + Gosel + Gosel + Gosel + Golf Course + + + + 524 + Fahren Sie auf die Gosel nach Nordosten + Waypoint + + + + 525 + Waypoint + + + + 526 + Waypoint + + + + 527 + Waypoint + + + + 528 + Biegen Sie rechts ab auf die Gössnitzer Strasse + Waypoint + + + + 529 + Waypoint + + + + 530 + Waypoint + + + + 531 + Biegen Sie links ab auf die Altenburger Strasse + Waypoint + + + + 532 + Waypoint + + + + 533 + Waypoint + + + 3 + B93 + B93 + Waypoint + + + + 534 + Fahren Sie auf die Altenburger Strasse nach Norden + Waypoint + + + + 535 + Waypoint + + + + 536 + Waypoint + + + + 537 + Waypoint + + + + 538 + Waypoint + + + + 539 + Waypoint + + + + 540 + Waypoint + + + + 541 + Waypoint + + + + 542 + Waypoint + + + + 543 + Waypoint + + + + 544 + Waypoint + + + + 545 + Waypoint + + + + 546 + Waypoint + + + + 547 + Waypoint + + + + 548 + Waypoint + + + + 549 + Biegen Sie links ab auf die Hauptstrasse + Waypoint + + + + 550 + Biegen Sie rechts ab auf die K61 + Waypoint + + + + 551 + Waypoint + + + + 552 + Waypoint + + + + 553 + Waypoint + + + + 554 + Waypoint + + + + 555 + Biegen Sie rechts ab auf die Schmöllner Strasse + Waypoint + + + + 556 + Halten Sie sich rechts in Richtung Straße + Waypoint + + + + 557 + Waypoint + + + + Altenburg-Umgehung + abgu (cmt) + abgu (cmt) + abgu (notes) + Golf Course + + + + 558 + Fahren Sie auf die Straße nach Nordosten + Waypoint + + + + 559 + Waypoint + + + + 560 + Waypoint + + + + 561 + Waypoint + + + + 562 + Waypoint + + + + 563 + Waypoint + + + + 564 + Waypoint + + + + 565 + Waypoint + + + + 566 + Waypoint + + + + 567 + Waypoint + + + + 568 + Waypoint + + + + 569 + Waypoint + + + + 570 + Waypoint + + + + 571 + Waypoint + + + + 572 + Waypoint + + + + 573 + Waypoint + + + + 574 + Waypoint + + + + 575 + Waypoint + + + + 576 + Waypoint + + + + 577 + Waypoint + + + + 578 + Waypoint + + + + 579 + Waypoint + + + + 580 + Waypoint + + + + 581 + Waypoint + + + + 582 + Waypoint + + + + 583 + Waypoint + + + + 584 + Waypoint + + + + 585 + Waypoint + + + + 586 + Waypoint + + + + 587 + Waypoint + + + + 588 + Biegen Sie links ab auf die Leipziger Strasse + Waypoint + + + + 589 + Waypoint + + + + 590 + Waypoint + + + + 591 + Waypoint + + + + 592 + Waypoint + + + + 593 + Waypoint + + + + 594 + Waypoint + + + + 595 + Waypoint + + + + 596 + Fahren Sie rechts ab auf die Prinz-Eugen-Strasse + Waypoint + + + + 597 + Waypoint + + + + 598 + Waypoint + + + + 599 + Biegen Sie rechts ab auf die Wolfgang-Heinze-Strasse + Waypoint + + + + 600 + Biegen Sie rechts ab auf die Meusdorfer Strasse + Waypoint + + + + 601 + Biegen Sie rechts ab auf die Arno-Nitzsche-Strasse + Waypoint + + + + 602 + Waypoint + + + + 603 + Waypoint + + + + 604 + Ordnen Sie sich rechts ein in Richtung Strasse Des 18. Oktober + Waypoint + + + + 605 + Waypoint + + + + Völkerschlachtdenkmal + P+R Am Völkerschlachtdenkmal + P+R Am Völkerschlachtdenkmal + http://Voelkerschlachtdenkmal + Waypoint + + + + ACTIVE LOG + + + 360.631714 + + + + 360.631714 + + + + 366.399536 + + + + 366.399536 + + + + 365.918945 + + + + 366.880249 + + + + 366.399536 + + + + 369.764282 + + + + 370.244873 + + + + 370.244873 + + + + 370.244873 + + + + 370.244873 + + + + 371.686890 + + + + 375.051514 + + + + 377.935425 + + + + 385.625977 + + + + 389.951904 + + + + 393.797241 + + + + 393.316528 + + + + 393.316528 + + + + 393.797241 + + + + 395.239136 + + + + 395.719849 + + + + 397.642456 + + + + 398.603760 + + + + 399.084351 + + + + 399.084351 + + + + 398.123169 + + + + 397.642456 + + + + 397.161743 + + + + 396.200562 + + + + 393.797241 + + + + 392.355347 + + + + 391.393799 + + + + 390.913208 + + + + 390.432617 + + + + 390.432617 + + + + 390.432617 + + + + 387.067993 + + + + 387.067993 + + + + 390.913208 + + + + 391.393799 + + + + 391.393799 + + + + 394.758545 + + + + 395.239136 + + + + 395.239136 + + + + 395.239136 + + + + 394.758545 + + + + 397.161743 + + + + 400.045898 + + + + 402.449097 + + + + 401.487793 + + + + 400.526489 + + + + 401.487793 + + + + 402.449097 + + + + 402.449097 + + + + 403.891113 + + + + 405.333008 + + + + 411.100952 + + + + 412.062256 + + + + 413.984863 + + + + 413.984863 + + + + 413.023560 + + + + 413.023560 + + + + 412.542847 + + + + 413.984863 + + + + 413.984863 + + + + 415.426880 + + + + 417.349609 + + + + 418.791504 + + + + 420.233398 + + + + 424.559448 + + + + 426.482056 + + + + 428.404663 + + + + 429.846558 + + + + 428.885376 + + + + 426.001343 + + + + 426.001343 + + + + 423.598022 + + + + 418.310791 + + + + 416.388184 + + + + 411.581665 + + + + 408.217041 + + + + 400.526489 + + + + 399.084351 + + + + 399.565063 + + + + 401.968506 + + + + 406.774902 + + + + 410.620239 + + + + 412.542847 + + + + 413.023560 + + + + 414.946167 + + + + 415.426880 + + + + 417.349609 + + + + 417.830200 + + + + 417.830200 + + + + 417.830200 + + + + 418.310791 + + + + 418.310791 + + + + 419.272217 + + + + 422.636719 + + + + 426.962769 + + + + 428.885376 + + + + 430.807983 + + + + 427.443359 + + + + 424.078735 + + + + 424.078735 + + + + 425.040161 + + + + 425.040161 + + + + 424.078735 + + + + 422.156006 + + + + 420.714111 + + + + 419.272217 + + + + 418.791504 + + + + 418.310791 + + + + 418.791504 + + + + 419.272217 + + + + 422.156006 + + + + 425.040161 + + + + 426.001343 + + + + 428.885376 + + + + 431.288574 + + + + 433.691895 + + + + 434.653320 + + + + 435.133911 + + + + 436.575928 + + + + 438.979126 + + + + 440.901855 + + + + 443.785767 + + + + 444.266479 + + + + 445.708374 + + + + 445.227661 + + + + 445.227661 + + + + 444.266479 + + + + 444.266479 + + + + 445.708374 + + + + 447.150269 + + + + 448.111816 + + + + 449.553711 + + + + 450.034424 + + + + 453.879639 + + + + 454.840820 + + + + 455.802246 + + + + 456.282959 + + + + 455.802246 + + + + 456.282959 + + + + 457.244263 + + + + 458.205566 + + + + 455.802246 + + + + 451.476318 + + + + 448.111816 + + + + 446.189087 + + + + 443.305054 + + + + 440.901855 + + + + 436.095215 + + + + 435.614502 + + + + 434.653320 + + + + 433.691895 + + + + 433.691895 + + + + 435.133911 + + + + 435.614502 + + + + 436.095215 + + + + 436.575928 + + + + 436.095215 + + + + 435.614502 + + + + 435.614502 + + + + 435.614502 + + + + 436.095215 + + + + 435.614502 + + + + 433.691895 + + + + 431.769165 + + + + 429.846558 + + + + 428.885376 + + + + 426.962769 + + + + 425.520752 + + + + 424.078735 + + + + 424.559448 + + + + 424.078735 + + + + 423.117432 + + + + 419.272217 + + + + 409.178345 + + + + 402.929688 + + + + 393.797241 + + + + 389.951904 + + + + 389.471191 + + + + 389.471191 + + + + 389.471191 + + + + 389.471191 + + + + 388.990601 + + + + 388.510010 + + + + 388.029297 + + + + 387.067993 + + + + 384.184082 + + + + 384.184082 + + + + 384.184082 + + + + 382.742065 + + + + 381.780640 + + + + 381.780640 + + + + 380.819458 + + + + 377.935425 + + + + 373.609497 + + + + 368.802979 + + + + 363.996338 + + + + 363.035034 + + + + 359.670410 + + + + 357.747803 + + + + 354.863770 + + + + 351.979858 + + + + 350.057251 + + + + 350.057251 + + + + 349.095825 + + + + 348.615234 + + + + 346.692627 + + + + 345.250610 + + + + 344.770020 + + + + 343.327881 + + + + 341.885986 + + + + 340.444092 + + + + 339.482666 + + + + 338.040771 + + + + 339.002075 + + + + 338.521484 + + + + 338.040771 + + + + 337.079468 + + + + 335.156738 + + + + 332.272827 + + + + 329.869507 + + + + 329.388916 + + + + 326.504883 + + + + 324.101562 + + + + 321.698364 + + + + 320.737061 + + + + 319.295044 + + + + 317.372437 + + + + 315.930420 + + + + 314.007812 + + + + 311.604492 + + + + 307.278564 + + + + 304.394653 + + + + 300.549316 + + + + 298.146118 + + + + 296.223511 + + + + 296.223511 + + + + 295.742676 + + + + 295.742676 + + + + 295.742676 + + + + 294.300781 + + + + 293.339355 + + + + 292.858765 + + + + 292.378174 + + + + 292.378174 + + + + 291.897461 + + + + 289.013550 + + + + 288.052246 + + + + 289.013550 + + + + 288.052246 + + + + 288.532959 + + + + 288.052246 + + + + 287.571411 + + + + 288.052246 + + + + 288.052246 + + + + 287.571411 + + + + 287.090820 + + + + 286.129517 + + + + 285.168213 + + + + 283.726196 + + + + 284.206909 + + + + 284.206909 + + + + 283.245605 + + + + 285.168213 + + + + 282.284302 + + + + 280.842407 + + + + 280.361694 + + + + 280.361694 + + + + 280.842407 + + + + 280.361694 + + + + 280.361694 + + + + 281.322998 + + + + 281.803589 + + + + 281.322998 + + + + 281.322998 + + + + 280.842407 + + + + 280.361694 + + + + 280.361694 + + + + 280.361694 + + + + 279.880859 + + + + 279.400269 + + + + 278.438965 + + + + 278.438965 + + + + 278.438965 + + + + 278.919678 + + + + 278.919678 + + + + 278.919678 + + + + 278.919678 + + + + 279.400269 + + + + 281.803589 + + + + 283.245605 + + + + 283.245605 + + + + 283.245605 + + + + 282.765015 + + + + 286.610229 + + + + 289.494141 + + + + 292.378174 + + + + 294.781372 + + + + 293.339355 + + + + 292.378174 + + + + 291.416748 + + + + 289.494141 + + + + 289.494141 + + + + 289.974854 + + + + 289.013550 + + + + 289.494141 + + + + 289.494141 + + + + 289.974854 + + + + 289.494141 + + + + 288.052246 + + + + 287.571411 + + + + 286.129517 + + + + 283.726196 + + + + 283.245605 + + + + 283.726196 + + + + 284.206909 + + + + 285.168213 + + + + 285.648804 + + + + 285.168213 + + + + 283.245605 + + + + 280.842407 + + + + 278.919678 + + + + 278.438965 + + + + 276.516357 + + + + 275.555054 + + + + 272.671143 + + + + 270.267700 + + + + 269.787109 + + + + 269.787109 + + + + 269.306519 + + + + 270.748413 + + + + 270.748413 + + + + 270.267700 + + + + 269.306519 + + + + 268.825806 + + + + 268.825806 + + + + 268.345093 + + + + 268.345093 + + + + 267.383911 + + + + 267.864502 + + + + 267.864502 + + + + 267.864502 + + + + 268.825806 + + + + 269.306519 + + + + 268.825806 + + + + 268.825806 + + + + 267.864502 + + + + 268.345093 + + + + 268.345093 + + + + 267.864502 + + + + 268.345093 + + + + 270.748413 + + + + 270.748413 + + + + 271.709717 + + + + 267.864502 + + + + 265.941895 + + + + 263.538574 + + + + 264.499878 + + + + 267.383911 + + + + 271.709717 + + + + 270.748413 + + + + 269.306519 + + + + 268.825806 + + + + 270.267700 + + + + 270.748413 + + + + 272.190430 + + + + 274.113037 + + + + 271.709717 + + + + 268.825806 + + + + 268.825806 + + + + 267.864502 + + + + 266.422485 + + + + 265.941895 + + + + 264.499878 + + + + 264.499878 + + + + 264.980591 + + + + 264.019287 + + + + 264.980591 + + + + 264.499878 + + + + 262.577148 + + + + 263.057861 + + + + 264.019287 + + + + 264.980591 + + + + 265.941895 + + + + 268.345093 + + + + 266.903198 + + + + 264.019287 + + + + 264.499878 + + + + 266.903198 + + + + 268.825806 + + + + 272.671143 + + + + 276.035645 + + + + 277.477661 + + + + 278.438965 + + + + 278.438965 + + + + 281.803589 + + + + 281.803589 + + + + 281.803589 + + + + 285.168213 + + + + 289.494141 + + + + 291.897461 + + + + 290.936157 + + + + 290.936157 + + + + 291.416748 + + + + 291.897461 + + + + 291.897461 + + + + 292.858765 + + + + 293.820068 + + + + 292.858765 + + + + 291.897461 + + + + 290.936157 + + + + 291.897461 + + + + 293.339355 + + + + 292.378174 + + + + 291.416748 + + + + 293.339355 + + + + 296.223511 + + + + 299.588013 + + + + 299.588013 + + + + 300.549316 + + + + 301.029907 + + + + 301.991333 + + + + 305.836670 + + + + 310.162476 + + + + 310.643066 + + + + 310.643066 + + + + 310.162476 + + + + 308.720459 + + + + 305.836670 + + + + 305.836670 + + + + 305.836670 + + + + 308.720459 + + + + 315.449829 + + + + 316.891724 + + + + 316.891724 + + + + 316.411011 + + + + 316.891724 + + + + 316.891724 + + + + 315.449829 + + + + 313.046509 + + + + 311.123779 + + + + 311.123779 + + + + 310.643066 + + + + 307.278564 + + + + 308.720459 + + + + 310.162476 + + + + 311.123779 + + + + 312.085205 + + + + 312.565796 + + + + 314.007812 + + + + 315.449829 + + + + 316.411011 + + + + 317.853027 + + + + 318.814331 + + + + 319.295044 + + + + 321.217773 + + + + 324.101562 + + + + 324.582275 + + + + 325.062988 + + + + 326.024170 + + + + 326.024170 + + + + 327.466187 + + + + 328.908325 + + + + 329.869507 + + + + 332.272827 + + + + 336.598877 + + + + 344.289429 + + + + 345.731323 + + + + 345.250610 + + + + 340.924683 + + + + 340.444092 + + + + 339.482666 + + + + 338.521484 + + + + 336.118164 + + + + 335.156738 + + + + 334.676147 + + + + 334.676147 + + + + 334.676147 + + + + 336.118164 + + + + 339.963379 + + + + 344.770020 + + + + 349.095825 + + + + 354.863770 + + + + 360.631714 + + + + 364.476929 + + + + 365.918945 + + + + 366.880249 + + + + 368.322266 + + + + 370.725586 + + + + 372.167480 + + + + 373.609497 + + + + 377.935425 + + + + 379.858032 + + + + 380.819458 + + + + 383.222656 + + + + 388.029297 + + + + 391.874512 + + + + 390.913208 + + + + 387.548584 + + + + 386.106689 + + + + 384.664795 + + + + 380.819458 + + + + 377.935425 + + + + 374.570801 + + + + 371.206299 + + + + 365.438354 + + + + 359.189697 + + + + 358.228394 + + + + 356.786377 + + + + 356.786377 + + + + 356.305786 + + + + 355.344482 + + + + 353.421875 + + + + 351.018433 + + + + 349.576538 + + + + 346.212036 + + + + 343.327881 + + + + 338.040771 + + + + 332.753540 + + + + 328.427612 + + + + 323.620972 + + + + 319.775635 + + + + 316.411011 + + + + 315.449829 + + + + 314.488403 + + + + 314.007812 + + + + 312.565796 + + + + 312.565796 + + + + 312.565796 + + + + 312.085205 + + + + 311.123779 + + + + 310.643066 + + + + 309.681885 + + + + 307.759277 + + + + 306.797852 + + + + 305.355957 + + + + 304.875244 + + + + 304.875244 + + + + 304.394653 + + + + 303.913940 + + + + 303.913940 + + + + 304.394653 + + + + 305.355957 + + + + 305.355957 + + + + 305.355957 + + + + 304.875244 + + + + 306.797852 + + + + 309.681885 + + + + 312.565796 + + + + 312.565796 + + + + 313.046509 + + + + 312.085205 + + + + 309.201172 + + + + 306.797852 + + + + 302.952515 + + + + 301.991333 + + + + 300.068726 + + + + 297.184692 + + + + 294.300781 + + + + 294.300781 + + + + 294.300781 + + + + 293.820068 + + + + 294.300781 + + + + 294.781372 + + + + 295.261963 + + + + 294.781372 + + + + 296.223511 + + + + 296.223511 + + + + 293.339355 + + + + 289.494141 + + + + 290.936157 + + + + 289.974854 + + + + 289.494141 + + + + 289.494141 + + + + 285.168213 + + + + 284.687622 + + + + 285.648804 + + + + 285.648804 + + + + 284.687622 + + + + 283.726196 + + + + 283.245605 + + + + 282.765015 + + + + 282.765015 + + + + 282.284302 + + + + 282.284302 + + + + 281.322998 + + + + 279.880859 + + + + 279.880859 + + + + 279.880859 + + + + 280.361694 + + + + 280.842407 + + + + 280.361694 + + + + 280.361694 + + + + 281.803589 + + + + 282.284302 + + + + 281.803589 + + + + 279.880859 + + + + 278.438965 + + + + 277.958252 + + + + 273.632446 + + + + 272.671143 + + + + 273.151855 + + + + 274.113037 + + + + 272.190430 + + + + 271.229126 + + + + 271.709717 + + + + 271.229126 + + + + 271.229126 + + + + 272.190430 + + + + 270.748413 + + + + 269.787109 + + + + 269.787109 + + + + 269.306519 + + + + 269.306519 + + + + 269.306519 + + + + 274.593750 + + + + 276.035645 + + + + 276.035645 + + + + 275.074463 + + + + 275.555054 + + + + 276.035645 + + + + 276.516357 + + + + 276.997070 + + + + 278.438965 + + + + 278.919678 + + + + 279.400269 + + + + 279.880859 + + + + 277.958252 + + + + 276.035645 + + + + 277.477661 + + + + 277.958252 + + + + 276.516357 + + + + 273.632446 + + + + 270.267700 + + + + 269.787109 + + + + 269.787109 + + + + 271.229126 + + + + 269.787109 + + + + 267.383911 + + + + 265.461304 + + + + 264.980591 + + + + 264.019287 + + + + 263.057861 + + + + 263.538574 + + + + 263.538574 + + + + 262.577148 + + + + 263.538574 + + + + 264.019287 + + + + 264.499878 + + + + 264.499878 + + + + 264.499878 + + + + 264.499878 + + + + 264.499878 + + + + 264.019287 + + + + 264.019287 + + + + 264.019287 + + + + 264.499878 + + + + 263.057861 + + + + 261.615967 + + + + 261.615967 + + + + 262.096558 + + + + 262.096558 + + + + 261.615967 + + + + 261.615967 + + + + 263.538574 + + + + 259.693359 + + + + 257.290039 + + + + 254.886597 + + + + 252.963989 + + + + 251.041382 + + + + 250.080200 + + + + 250.080200 + + + + 251.522095 + + + + 252.963989 + + + + 255.367310 + + + + 256.328735 + + + + 257.290039 + + + + 256.809326 + + + + 254.406006 + + + + 252.963989 + + + + 251.041382 + + + + 249.599487 + + + + 250.080200 + + + + 249.118774 + + + + 248.157593 + + + + 251.522095 + + + + 252.002808 + + + + 251.041382 + + + + 248.638184 + + + + 248.638184 + + + + 247.676758 + + + + 245.273438 + + + + 243.831543 + + + + 240.947632 + + + + 239.024902 + + + + 239.024902 + + + + 237.102295 + + + + 237.582886 + + + + 239.024902 + + + + 242.870239 + + + + 243.831543 + + + + 244.312256 + + + + 244.792847 + + + + 244.792847 + + + + 243.350830 + + + + 244.792847 + + + + 244.792847 + + + + 243.350830 + + + + 245.273438 + + + + 247.196045 + + + + 247.676758 + + + + 248.638184 + + + + 251.041382 + + + + 250.560791 + + + + 246.715454 + + + + 245.754150 + + + + 243.831543 + + + + 240.467041 + + + + 239.986206 + + + + 239.986206 + + + + 243.350830 + + + + 243.831543 + + + + 243.831543 + + + + 242.870239 + + + + 242.870239 + + + + 239.505493 + + + + 235.179688 + + + + 235.660278 + + + + 235.660278 + + + + 236.140991 + + + + 236.621704 + + + + 234.699097 + + + + 231.334351 + + + + 229.411743 + + + + 229.411743 + + + + 231.814941 + + + + 232.776489 + + + + 232.776489 + + + + 232.776489 + + + + 233.257080 + + + + 232.776489 + + + + 232.295776 + + + + 231.814941 + + + + 231.814941 + + + + 231.814941 + + + + 231.814941 + + + + 231.814941 + + + + 231.814941 + + + + 231.814941 + + + + 231.334351 + + + + 231.334351 + + + + 230.853760 + + + + 229.892334 + + + + 229.411743 + + + + 229.411743 + + + + 229.411743 + + + + 229.411743 + + + + 230.373047 + + + + 230.373047 + + + + 229.892334 + + + + 228.450439 + + + + 228.450439 + + + + 227.969727 + + + + 227.969727 + + + + 225.566528 + + + + 224.124512 + + + + 222.682495 + + + + 222.682495 + + + + 222.682495 + + + + 221.240601 + + + + 220.279175 + + + + 220.279175 + + + + 220.759888 + + + + 220.759888 + + + + 221.721191 + + + + 221.721191 + + + + 221.721191 + + + + 221.721191 + + + + 221.721191 + + + + 222.201782 + + + + 223.643799 + + + + 224.124512 + + + + 223.643799 + + + + 223.643799 + + + + 223.643799 + + + + 222.682495 + + + + 223.643799 + + + + 223.643799 + + + + 224.605225 + + + + 225.085938 + + + + 225.085938 + + + + 225.566528 + + + + 226.047119 + + + + 227.008545 + + + + 227.489136 + + + + 227.008545 + + + + 227.008545 + + + + 226.527832 + + + + 227.008545 + + + + 227.489136 + + + + 227.969727 + + + + 227.969727 + + + + 227.969727 + + + + 227.969727 + + + + 227.008545 + + + + 227.008545 + + + + 227.008545 + + + + 226.527832 + + + + 226.047119 + + + + 226.047119 + + + + 228.931152 + + + + 227.489136 + + + + 226.527832 + + + + 226.527832 + + + + 227.008545 + + + + 227.008545 + + + + 225.085938 + + + + 224.605225 + + + + 224.124512 + + + + 223.643799 + + + + 223.643799 + + + + 224.605225 + + + + 227.969727 + + + + 225.085938 + + + + 224.124512 + + + + 224.124512 + + + + 223.163208 + + + + 222.682495 + + + + 222.201782 + + + + 222.201782 + + + + 222.682495 + + + + 222.682495 + + + + 224.124512 + + + + 225.566528 + + + + 224.605225 + + + + 223.163208 + + + + 223.163208 + + + + 221.721191 + + + + 222.201782 + + + + 222.682495 + + + + 222.682495 + + + + 222.201782 + + + + 222.201782 + + + + 222.201782 + + + + 222.201782 + + + + 222.201782 + + + + 219.317993 + + + + 218.837280 + + + + 219.317993 + + + + 219.317993 + + + + 219.317993 + + + + 218.837280 + + + + 218.837280 + + + + 218.837280 + + + + 218.837280 + + + + 218.356567 + + + + 218.356567 + + + + 216.914673 + + + + 215.953247 + + + + 218.356567 + + + + 224.124512 + + + + 225.085938 + + + + 227.008545 + + + + 224.124512 + + + + 221.721191 + + + + 217.875977 + + + + 214.030640 + + + + 214.030640 + + + + 216.914673 + + + + 218.356567 + + + + 218.837280 + + + + 220.279175 + + + + 222.682495 + + + + 225.085938 + + + + 226.047119 + + + + 225.566528 + + + + 225.566528 + + + + 222.682495 + + + + 221.721191 + + + + 215.953247 + + + + 213.550049 + + + + 213.069336 + + + + 211.627441 + + + + 210.185425 + + + + 209.224121 + + + + 208.743408 + + + + 208.262817 + + + + 208.262817 + + + + 208.262817 + + + + 206.340088 + + + + 204.898071 + + + + 202.975464 + + + + 202.494873 + + + + 202.494873 + + + + 204.898071 + + + + 205.378784 + + + + 205.378784 + + + + 205.378784 + + + + 204.898071 + + + + 202.014282 + + + + 199.610840 + + + + 200.091675 + + + + 199.610840 + + + + 199.610840 + + + + 199.610840 + + + + 200.091675 + + + + 202.014282 + + + + 204.417480 + + + + 204.417480 + + + + 205.378784 + + + + 205.378784 + + + + 208.262817 + + + + 207.782104 + + + + 207.782104 + + + + 206.340088 + + + + 203.936890 + + + + 202.014282 + + + + 201.533569 + + + + 201.052856 + + + + 200.091675 + + + + 200.091675 + + + + 201.052856 + + + + 202.014282 + + + + 202.975464 + + + + 202.975464 + + + + 202.975464 + + + + 202.494873 + + + + 202.014282 + + + + 203.936890 + + + + 204.417480 + + + + 203.936890 + + + + 203.456177 + + + + 202.494873 + + + + 200.091675 + + + + 198.168945 + + + + 196.246338 + + + + 196.726929 + + + + 197.207520 + + + + 197.688232 + + + + 197.207520 + + + + 196.726929 + + + + 196.246338 + + + + 195.284912 + + + + 195.765625 + + + + 195.765625 + + + + 196.246338 + + + + 196.246338 + + + + 196.726929 + + + + 198.168945 + + + + 198.168945 + + + + 197.688232 + + + + 196.726929 + + + + 198.168945 + + + + 197.207520 + + + + 197.688232 + + + + 201.533569 + + + + 201.052856 + + + + 205.378784 + + + + 210.185425 + + + + 214.991943 + + + + 209.224121 + + + + 203.456177 + + + + 196.726929 + + + + 194.804321 + + + + 196.246338 + + + + 198.168945 + + + + 198.649536 + + + + 195.765625 + + + + 193.843018 + + + + 192.881714 + + + + 191.439575 + + + + 191.439575 + + + + 190.958984 + + + + 190.478394 + + + + 190.958984 + + + + 191.920288 + + + + 191.439575 + + + + 187.594360 + + + + 183.749023 + + + + 183.749023 + + + + 185.191162 + + + + 186.152466 + + + + 187.113770 + + + + 190.478394 + + + + 192.881714 + + + + 197.688232 + + + + 203.456177 + + + + 206.340088 + + + + 208.743408 + + + + 211.146729 + + + + 214.511230 + + + + 220.759888 + + + + 224.124512 + + + + 224.605225 + + + + 226.047119 + + + + 225.566528 + + + + 225.566528 + + + + 224.605225 + + + + 224.124512 + + + + 224.124512 + + + + 224.124512 + + + + 224.605225 + + + + 225.566528 + + + + 226.527832 + + + + 227.489136 + + + + 227.489136 + + + + 226.047119 + + + + 224.605225 + + + + 222.201782 + + + + 220.759888 + + + + 216.914673 + + + + 210.185425 + + + + 204.898071 + + + + 201.052856 + + + + 198.649536 + + + + 197.688232 + + + + 198.168945 + + + + 200.091675 + + + + 201.533569 + + + + 202.494873 + + + + 203.936890 + + + + 204.417480 + + + + 203.456177 + + + + 201.533569 + + + + 195.284912 + + + + 190.478394 + + + + 184.710571 + + + + 180.384521 + + + + 178.942627 + + + + 178.461914 + + + + 179.423218 + + + + 180.384521 + + + + 182.787842 + + + + 185.191162 + + + + 187.113770 + + + + 188.075073 + + + + 188.555786 + + + + 189.997681 + + + + 190.958984 + + + + 192.401123 + + + + 196.246338 + + + + 198.168945 + + + + 199.610840 + + + + 199.130127 + + + + 198.168945 + + + + 195.765625 + + + + 191.920288 + + + + 186.633179 + + + + 181.345825 + + + + 174.616577 + + + + 170.290649 + + + + 168.848755 + + + + 168.368042 + + + + 169.329468 + + + + 170.290649 + + + + 170.290649 + + + + 169.810059 + + + + 168.848755 + + + + 168.368042 + + + + 166.926025 + + + + 166.445312 + + + + 165.964722 + + + + 165.484131 + + + + 165.003418 + + + + 164.522705 + + + + 165.003418 + + + + 166.926025 + + + + 168.848755 + + + + 169.810059 + + + + 166.445312 + + + + 162.600098 + + + + 160.677490 + + + + 157.793579 + + + + 156.351562 + + + + 154.428955 + + + + 153.467651 + + + + 153.948364 + + + + 153.467651 + + + + 152.506348 + + + + 151.544922 + + + + 151.064209 + + + + 148.180420 + + + + 146.738403 + + + + 146.738403 + + + + 147.699707 + + + + 148.180420 + + + + 148.180420 + + + + 149.622314 + + + + 150.103027 + + + + 150.103027 + + + + 148.661011 + + + + 148.180420 + + + + 147.699707 + + + + 147.218994 + + + + 147.218994 + + + + 146.738403 + + + + 146.257812 + + + + 146.738403 + + + + 147.218994 + + + + 147.699707 + + + + 147.218994 + + + + 147.218994 + + + + 147.218994 + + + + 147.699707 + + + + 147.699707 + + + + 147.699707 + + + + 147.699707 + + + + 148.180420 + + + + 148.180420 + + + + 149.141602 + + + + 149.622314 + + + + 150.103027 + + + + 150.103027 + + + + 150.583618 + + + + 151.064209 + + + + 151.064209 + + + + 151.544922 + + + + 153.467651 + + + + 155.390259 + + + + 157.312866 + + + + 159.235474 + + + + 154.909546 + + + + 152.025757 + + + + 152.986938 + + + + 158.754761 + + + + 162.119507 + + + + 164.522705 + + + + 165.484131 + + + + 166.926025 + + + + 169.329468 + + + + 170.290649 + + + + 170.290649 + + + + 169.329468 + + + + 167.406738 + + + + 165.484131 + + + + 164.522705 + + + + 164.042114 + + + + 163.561523 + + + + 163.561523 + + + + 162.600098 + + + + 161.638916 + + + + 158.274170 + + + + 155.870972 + + + + 154.428955 + + + + 153.467651 + + + + 153.467651 + + + + 153.948364 + + + + 154.428955 + + + + 154.909546 + + + + 153.467651 + + + + 149.141602 + + + + 148.661011 + + + + 147.699707 + + + + 146.257812 + + + + 145.296387 + + + + 144.335205 + + + + 143.854370 + + + + 142.412476 + + + + 140.009155 + + + + 139.528442 + + + + 138.567261 + + + + 140.009155 + + + + 141.451050 + + + + 140.970459 + + + + 140.489868 + + + + 140.009155 + + + + 139.047852 + + + + 139.047852 + + + + 137.605835 + + + + 138.567261 + + + + 139.528442 + + + + 137.605835 + + + + 137.125244 + + + + 137.605835 + + + + 138.567261 + + + + 140.009155 + + + + 140.970459 + + + + 156.351562 + + + + 156.351562 + + + + 157.793579 + + + + 159.235474 + + + + 159.235474 + + + + 159.235474 + + + + 160.196899 + + + + 159.716187 + + + + 159.235474 + + + + 158.274170 + + + + 157.312866 + + + + 158.274170 + + + + 158.754761 + + + + 158.754761 + + + + 157.793579 + + + + 156.351562 + + + + 154.428955 + + + + 152.506348 + + + + 150.103027 + + + + 148.180420 + + + + 145.296387 + + + + 142.893066 + + + + 140.489868 + + + + 139.528442 + + + + 141.451050 + + + + 142.893066 + + + + 145.296387 + + + + 147.218994 + + + + 147.699707 + + + + 147.218994 + + + + 148.180420 + + + + 148.180420 + + + + 149.141602 + + + + 149.622314 + + + + 150.583618 + + + + 150.583618 + + + + 151.064209 + + + + 151.544922 + + + + 152.506348 + + + + 153.467651 + + + + 153.467651 + + + + 153.467651 + + + + 153.467651 + + + + 153.948364 + + + + 155.870972 + + + + 157.312866 + + + + 158.274170 + + + + 158.274170 + + + + 158.754761 + + + + 158.754761 + + + + 157.793579 + + + + 156.832153 + + + + 156.351562 + + + + 154.909546 + + + + 152.506348 + + + + 151.544922 + + + + 149.622314 + + + + 148.180420 + + + + 148.180420 + + + + 147.699707 + + + + 147.218994 + + + + 147.699707 + + + + 147.699707 + + + + 148.180420 + + + + 148.661011 + + + + 149.141602 + + + + 148.661011 + + + + 148.661011 + + + + 149.141602 + + + + 149.622314 + + + + 150.103027 + + + + 149.141602 + + + + 147.699707 + + + + 147.218994 + + + + 146.738403 + + + + 144.815796 + + + + 142.412476 + + + + 141.451050 + + + + 140.009155 + + + + 141.931763 + + + + 142.893066 + + + + 143.373657 + + + + 146.257812 + + + + 148.180420 + + + + 148.180420 + + + + 147.699707 + + + + 146.257812 + + + + 141.451050 + + + + 134.241211 + + + + 127.992554 + + + + 125.589355 + + + + 124.628052 + + + + 126.069946 + + + + 127.511963 + + + + 125.108765 + + + + 126.069946 + + + + 126.550659 + + + + 125.589355 + + + + 125.589355 + + + + 127.031372 + + + + 126.550659 + + + + 125.108765 + + + + 124.147339 + + + + 123.186157 + + + + 122.705444 + + + + 123.666748 + + + + 124.147339 + + + + 124.147339 + + + + 124.147339 + + + + 124.147339 + + + + 122.705444 + + + + 122.224731 + + + + 120.782837 + + + + 120.302124 + + + + 119.821411 + + + + 118.379395 + + + + 117.898804 + + + + 117.418213 + + + + 117.418213 + + + + 116.937500 + + + + 116.456787 + + + + 116.456787 + + + + 116.937500 + + + + 116.937500 + + + + 116.456787 + + + + 116.937500 + + + + 116.937500 + + + + 116.937500 + + + + 115.976196 + + + + 114.534180 + + + + 114.053589 + + + + 113.572998 + + + + 113.572998 + + + + 114.053589 + + + + 113.572998 + + + + 113.572998 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 112.611572 + + + + 112.611572 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 112.130981 + + + + 112.130981 + + + + 112.130981 + + + + 111.650269 + + + + 110.688843 + + + + 110.688843 + + + + 112.130981 + + + + 114.053589 + + + + 114.534180 + + + + 113.092285 + + + + 113.572998 + + + + 115.976196 + + + + 116.937500 + + + + 117.418213 + + + + 115.014893 + + + + 112.130981 + + + + 109.727661 + + + + 109.246948 + + + + 108.285645 + + + + 109.246948 + + + + 109.727661 + + + + 109.246948 + + + + 107.805054 + + + + 105.882446 + + + + 107.805054 + + + + 109.246948 + + + + 108.766235 + + + + 109.727661 + + + + 110.688843 + + + + 112.130981 + + + + 112.130981 + + + + 110.688843 + + + + 109.246948 + + + + 106.363037 + + + + 106.363037 + + + + 110.208252 + + + + 111.169556 + + + + 111.650269 + + + + 112.611572 + + + + 114.053589 + + + + 115.976196 + + + + 116.456787 + + + + 115.976196 + + + + 116.456787 + + + + 116.456787 + + + + 120.782837 + + + + 122.705444 + + + + 119.821411 + + + + 119.821411 + + + + 120.302124 + + + + 119.821411 + + + + 119.821411 + + + + 120.302124 + + + + 121.263550 + + + + 121.744141 + + + + 122.705444 + + + + 123.666748 + + + + 124.147339 + + + + 124.147339 + + + + 125.108765 + + + + 127.031372 + + + + 127.992554 + + + + 128.473389 + + + + 129.434692 + + + + 130.395996 + + + + 129.915283 + + + + 129.434692 + + + + 139.528442 + + + + 138.567261 + + + + 137.605835 + + + + 137.605835 + + + + 136.644653 + + + + 135.683105 + + + + 135.202515 + + + + 137.125244 + + + + 136.644653 + + + + 136.644653 + + + + 135.202515 + + + + 134.241211 + + + + 134.241211 + + + + 134.241211 + + + + 135.683105 + + + + 137.125244 + + + + 139.047852 + + + + 140.009155 + + + + 140.489868 + + + + 140.970459 + + + + 140.970459 + + + + 139.528442 + + + + 137.605835 + + + + 136.163940 + + + + 133.760498 + + + + 139.047852 + + + + 139.528442 + + + + 138.567261 + + + + 139.047852 + + + + 139.528442 + + + + 140.970459 + + + + 139.047852 + + + + 138.567261 + + + + 139.047852 + + + + 141.931763 + + + + 141.931763 + + + + 141.931763 + + + + 141.931763 + + + + 142.412476 + + + + 143.854370 + + + + 146.257812 + + + + 145.296387 + + + + 141.931763 + + + + 141.451050 + + + + 141.451050 + + + + 140.970459 + + + + 139.528442 + + + + 137.125244 + + + + 135.202515 + + + + 134.721924 + + + + 136.644653 + + + + 136.644653 + + + + 135.683105 + + + + 145.777100 + + + + 141.931763 + + + + 137.605835 + + + + 145.777100 + + + + 145.296387 + + + + 146.738403 + + + + 148.661011 + + + + 150.103027 + + + + 142.893066 + + + + 140.970459 + + + + 140.009155 + + + + 142.412476 + + + + 140.970459 + + + + 142.412476 + + + + 144.335205 + + + + 141.931763 + + + + 140.970459 + + + + 140.970459 + + + + 139.528442 + + + + 141.451050 + + + + 143.373657 + + + + 144.815796 + + + + 146.257812 + + + + + + ACTIVE LOG 001 + + + 146.257812 + + + + 145.777100 + + + + 146.738403 + + + + 141.931763 + + + + 141.931763 + + + + 141.451050 + + + + 141.931763 + + + + 142.412476 + + + + 141.931763 + + + + 142.893066 + + + + 142.412476 + + + + 134.241211 + + + + 135.683105 + + + + 136.163940 + + + + 136.644653 + + + + 139.047852 + + + + 142.412476 + + + + + + ACTIVE LOG 002 + + + 136.163940 + + + + 147.699707 + + + + 146.738403 + + + + 154.428955 + + + + 151.064209 + + + + 144.335205 + + + + 142.412476 + + + + 134.241211 + + + + 135.202515 + + + + 135.683105 + + + + 135.202515 + + + + + + ACTIVE LOG 003 + + + 149.622314 + + + + + + ACTIVE LOG 004 + + + 160.677490 + + + + + + ACTIVE LOG 005 + + + 161.158203 + + + + + + ACTIVE LOG 006 + + + 161.158203 + + + + 153.948364 + + + + 148.180420 + + + + 138.567261 + + + + 144.815796 + + + + 133.760498 + + + + 130.876709 + + + + 130.395996 + + + + 131.837891 + + + + 143.854370 + + + + 147.218994 + + + + 145.296387 + + + + 145.296387 + + + + 135.202515 + + + + 134.721924 + + + + 136.163940 + + + + 135.202515 + + + + 138.567261 + + + + 138.567261 + + + + 140.970459 + + + + 139.528442 + + + + 140.489868 + + + + 151.544922 + + + + 152.025757 + + + + 155.390259 + + + + 148.661011 + + + + 149.622314 + + + + 150.583618 + + + + 150.583618 + + + + 149.622314 + + + + 149.622314 + + + + 149.622314 + + + + 149.622314 + + + + 143.373657 + + + + 141.451050 + + + + 143.373657 + + + + 138.567261 + + + + 138.567261 + + + + 138.086548 + + + + 138.567261 + + + + 143.854370 + + + + 144.815796 + + + + + + ACTIVE LOG 007 + + + 150.583618 + + + + 152.025757 + + + + 136.644653 + + + + 133.760498 + + + + 133.760498 + + + + 135.202515 + + + + 131.837891 + + + + 136.644653 + + + + 136.163940 + + + + 134.721924 + + + + 133.760498 + + + + 133.279907 + + + + 131.837891 + + + + 128.954102 + + + + 127.511963 + + + + 126.550659 + + + + 125.589355 + + + + 124.628052 + + + + 123.666748 + + + + 123.186157 + + + + 123.186157 + + + + 120.782837 + + + + 121.263550 + + + + 120.302124 + + + + 118.379395 + + + + 116.937500 + + + + 115.014893 + + + + 114.053589 + + + + 113.092285 + + + + 112.611572 + + + + 112.130981 + + + + 112.611572 + + + + 112.611572 + + + + 113.092285 + + + + 113.572998 + + + + 113.092285 + + + + 112.611572 + + + + 112.611572 + + + + 115.014893 + + + + 115.014893 + + + + 114.053589 + + + + 115.976196 + + + + 115.976196 + + + + 115.976196 + + + + 115.014893 + + + + 114.534180 + + + + 112.130981 + + + + 112.130981 + + + + 109.727661 + + + + 109.727661 + + + + 108.766235 + + + + 110.208252 + + + + 110.208252 + + + + 110.208252 + + + + 111.169556 + + + + 111.650269 + + + + 112.611572 + + + + 112.130981 + + + + 112.130981 + + + + 111.650269 + + + + 110.208252 + + + + 108.766235 + + + + 107.324341 + + + + 106.843628 + + + + 107.324341 + + + + 107.805054 + + + + 107.805054 + + + + 107.324341 + + + + 109.727661 + + + + 110.208252 + + + + 111.169556 + + + + 111.650269 + + + + 113.092285 + + + + 115.014893 + + + + 115.976196 + + + + 114.534180 + + + + 113.092285 + + + + 112.130981 + + + + 112.130981 + + + + 112.611572 + + + + 111.169556 + + + + 109.727661 + + + + 109.246948 + + + + 109.246948 + + + + 110.208252 + + + + 110.208252 + + + + 110.688843 + + + + 111.650269 + + + + 112.130981 + + + + 112.130981 + + + + 112.130981 + + + + 112.611572 + + + + 112.611572 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 113.092285 + + + + 114.053589 + + + + 114.534180 + + + + 115.976196 + + + + 117.418213 + + + + 116.456787 + + + + 116.937500 + + + + 116.937500 + + + + 116.456787 + + + + 116.937500 + + + + 116.937500 + + + + 116.937500 + + + + 117.418213 + + + + 118.379395 + + + + 119.821411 + + + + 120.302124 + + + + 120.302124 + + + + 122.705444 + + + + 122.224731 + + + + 122.224731 + + + + 122.224731 + + + + 122.705444 + + + + 122.705444 + + + + 123.666748 + + + + 124.628052 + + + + 123.186157 + + + + 121.744141 + + + + 121.744141 + + + + 122.705444 + + + + 120.782837 + + + + 121.744141 + + + + 122.705444 + + + + 119.821411 + + + + 122.705444 + + + + 128.473389 + + + + 133.760498 + + + + 138.567261 + + + + 142.893066 + + + + 143.373657 + + + + 142.893066 + + + + 141.451050 + + + + 137.605835 + + + + 136.644653 + + + + 136.644653 + + + + 135.683105 + + + + 135.683105 + + + + 136.644653 + + + + 137.605835 + + + + 138.567261 + + + + 139.528442 + + + + 140.489868 + + + + 141.451050 + + + + 142.412476 + + + + 142.412476 + + + + 142.412476 + + + + 142.412476 + + + + 142.412476 + + + + 143.373657 + + + + 144.335205 + + + + 145.296387 + + + + 145.777100 + + + + 145.777100 + + + + 146.257812 + + + + 146.257812 + + + + 147.218994 + + + + 148.661011 + + + + 149.622314 + + + + 151.544922 + + + + 153.467651 + + + + 154.909546 + + + + 155.870972 + + + + 156.832153 + + + + 158.274170 + + + + 159.716187 + + + + 159.235474 + + + + 158.754761 + + + + 158.274170 + + + + 156.351562 + + + + 156.351562 + + + + 154.909546 + + + + 154.428955 + + + + 153.948364 + + + + 152.986938 + + + + 152.025757 + + + + 151.544922 + + + + 152.025757 + + + + 151.064209 + + + + 149.622314 + + + + 147.218994 + + + + 144.815796 + + + + 143.854370 + + + + 143.373657 + + + + 143.373657 + + + + 143.373657 + + + + 142.412476 + + + + 141.451050 + + + + 139.047852 + + + + 135.202515 + + + + 133.279907 + + + + 133.760498 + + + + 134.241211 + + + + 137.125244 + + + + 140.489868 + + + + 142.893066 + + + + 144.815796 + + + + 146.738403 + + + + 148.180420 + + + + 149.141602 + + + + 150.583618 + + + + 151.064209 + + + + 151.064209 + + + + 151.064209 + + + + 150.103027 + + + + 149.622314 + + + + 150.103027 + + + + 150.583618 + + + + 151.064209 + + + + 151.544922 + + + + 152.025757 + + + + 152.986938 + + + + 154.428955 + + + + 154.428955 + + + + 154.428955 + + + + 154.909546 + + + + 147.699707 + + + + 141.931763 + + + + 139.047852 + + + + 137.125244 + + + + 132.799316 + + + + 130.876709 + + + + 129.915283 + + + + 129.915283 + + + + 129.915283 + + + + 129.915283 + + + + 131.357300 + + + + 132.318604 + + + + 132.799316 + + + + 133.760498 + + + + 134.721924 + + + + 135.683105 + + + + 135.202515 + + + + 135.202515 + + + + 132.318604 + + + + 133.760498 + + + + 135.683105 + + + + 137.125244 + + + + 139.528442 + + + + 140.009155 + + + + 140.970459 + + + + 140.970459 + + + + 141.931763 + + + + 142.412476 + + + + 142.412476 + + + + 142.893066 + + + + 143.373657 + + + + 143.373657 + + + + 143.373657 + + + + 143.854370 + + + + 144.815796 + + + + 147.699707 + + + + 146.738403 + + + + 146.257812 + + + + 145.777100 + + + + 145.296387 + + + + 146.738403 + + + + 147.699707 + + + + 148.661011 + + + + 150.103027 + + + + 152.506348 + + + + 154.909546 + + + + 156.832153 + + + + 157.312866 + + + + 157.793579 + + + + 157.793579 + + + + 158.274170 + + + + 158.274170 + + + + 159.235474 + + + + 162.119507 + + + + 164.042114 + + + + 165.003418 + + + + 165.003418 + + + + 164.042114 + + + + 163.080811 + + + + 162.119507 + + + + 162.600098 + + + + 163.561523 + + + + 162.600098 + + + + 161.638916 + + + + 160.196899 + + + + 156.832153 + + + + 152.506348 + + + + 155.390259 + + + + 156.351562 + + + + 155.870972 + + + + 152.025757 + + + + 149.622314 + + + + 147.699707 + + + + 146.738403 + + + + 146.738403 + + + + 146.257812 + + + + 145.777100 + + + + 144.815796 + + + + 144.335205 + + + + 144.335205 + + + + 144.335205 + + + + 144.335205 + + + + 143.854370 + + + + 144.335205 + + + + 144.335205 + + + + 144.335205 + + + + 144.815796 + + + + 145.296387 + + + + 145.777100 + + + + 146.257812 + + + + 146.738403 + + + + 146.738403 + + + + 146.257812 + + + + 146.738403 + + + + 146.738403 + + + + 146.257812 + + + + 145.777100 + + + + 147.218994 + + + + 147.218994 + + + + 147.218994 + + + + 147.218994 + + + + 147.218994 + + + + 148.180420 + + + + 147.699707 + + + + 148.180420 + + + + 149.622314 + + + + 150.103027 + + + + 150.103027 + + + + 149.622314 + + + + 148.180420 + + + + 148.180420 + + + + 148.661011 + + + + 149.141602 + + + + 149.141602 + + + + 149.141602 + + + + 148.180420 + + + + 149.622314 + + + + 152.986938 + + + + 154.909546 + + + + 156.351562 + + + + 158.274170 + + + + 161.638916 + + + + 164.522705 + + + + 164.042114 + + + + 161.638916 + + + + 159.716187 + + + + 158.754761 + + + + 160.196899 + + + + 161.158203 + + + + 161.638916 + + + + 162.119507 + + + + 162.600098 + + + + 164.042114 + + + + 165.003418 + + + + 165.964722 + + + + 166.926025 + + + + 166.926025 + + + + 165.484131 + + + + 166.926025 + + + + 168.368042 + + + + 170.771362 + + + + 172.213257 + + + + 173.655273 + + + + 176.058594 + + + + 180.384521 + + + + 186.152466 + + + + 189.516968 + + + + 192.401123 + + + + 194.323730 + + + + 194.804321 + + + + 193.843018 + + + + 190.478394 + + + + 187.113770 + + + + 186.633179 + + + + 185.671753 + + + + 184.710571 + + + + 182.787842 + + + + 181.826416 + + + + 179.903809 + + + + 177.500610 + + + + 174.616577 + + + + 172.693970 + + + + 171.732666 + + + + 172.213257 + + + + 174.135864 + + + + 177.020020 + + + + 183.749023 + + + + 189.516968 + + + + 193.843018 + + + + 197.688232 + + + + 200.091675 + + + + 200.572266 + + + + 199.130127 + + + + 197.207520 + + + + 195.284912 + + + + 193.362305 + + + + 191.439575 + + + + 191.439575 + + + + 193.362305 + + + + 197.207520 + + + + 202.014282 + + + + 207.301392 + + + + 214.030640 + + + + 217.395386 + + + + 219.798584 + + + + 222.201782 + + + + 224.124512 + + + + 222.682495 + + + + 221.721191 + + + + 220.759888 + + + + 220.279175 + + + + 220.759888 + + + + 222.201782 + + + + 224.605225 + + + + 226.527832 + + + + 227.008545 + + + + 227.008545 + + + + 226.527832 + + + + 226.527832 + + + + 226.047119 + + + + 225.566528 + + + + 226.047119 + + + + 227.008545 + + + + 227.489136 + + + + 227.969727 + + + + 226.047119 + + + + 222.682495 + + + + 221.240601 + + + + 218.356567 + + + + 216.914673 + + + + 215.472656 + + + + 217.875977 + + + + 220.759888 + + + + 224.605225 + + + + 226.527832 + + + + 229.892334 + + + + 232.295776 + + + + 231.814941 + + + + 231.334351 + + + + 228.931152 + + + + 224.605225 + + + + 220.759888 + + + + 216.914673 + + + + 213.069336 + + + + 206.820679 + + + + 202.494873 + + + + 199.130127 + + + + 196.246338 + + + + 194.323730 + + + + 193.843018 + + + + 193.843018 + + + + 193.362305 + + + + 191.920288 + + + + 189.516968 + + + + 187.113770 + + + + 184.710571 + + + + 182.307129 + + + + 182.307129 + + + + 182.307129 + + + + 182.787842 + + + + 182.787842 + + + + 182.307129 + + + + 182.307129 + + + + 182.787842 + + + + 183.268433 + + + + 184.229858 + + + + 183.749023 + + + + 183.749023 + + + + 183.749023 + + + + 183.749023 + + + + 183.268433 + + + + 183.268433 + + + + 183.268433 + + + + 183.268433 + + + + 183.268433 + + + + 183.749023 + + + + 183.268433 + + + + 183.749023 + + + + 183.749023 + + + + 184.229858 + + + + 184.229858 + + + + 183.749023 + + + + 183.749023 + + + + 184.710571 + + + + 185.191162 + + + + 185.191162 + + + + 185.671753 + + + + 185.191162 + + + + 185.191162 + + + + 185.671753 + + + + 185.671753 + + + + 186.633179 + + + + 186.633179 + + + + 187.113770 + + + + 187.113770 + + + + 188.075073 + + + + 189.516968 + + + + 188.075073 + + + + 188.555786 + + + + 188.555786 + + + + 189.516968 + + + + 189.516968 + + + + 189.997681 + + + + 189.997681 + + + + 189.516968 + + + + 189.997681 + + + + 191.439575 + + + + 192.881714 + + + + 194.323730 + + + + 195.765625 + + + + 195.284912 + + + + 194.804321 + + + + 193.362305 + + + + 192.881714 + + + + 192.881714 + + + + 193.362305 + + + + 192.881714 + + + + 190.958984 + + + + 189.516968 + + + + 189.516968 + + + + 188.555786 + + + + 188.555786 + + + + 188.555786 + + + + 188.555786 + + + + 189.516968 + + + + 190.958984 + + + + 189.516968 + + + + 189.036377 + + + + 188.555786 + + + + 188.555786 + + + + 188.075073 + + + + 188.075073 + + + + 188.555786 + + + + 189.516968 + + + + 189.997681 + + + + 190.478394 + + + + 189.516968 + + + + 189.997681 + + + + 190.478394 + + + + 191.920288 + + + + 191.920288 + + + + 191.920288 + + + + 191.439575 + + + + 191.439575 + + + + 191.439575 + + + + 190.958984 + + + + 191.439575 + + + + 191.439575 + + + + 191.920288 + + + + 192.401123 + + + + 192.401123 + + + + 192.401123 + + + + 191.920288 + + + + 191.439575 + + + + 191.920288 + + + + 193.362305 + + + + 195.284912 + + + + 197.688232 + + + + 198.168945 + + + + 199.130127 + + + + 199.610840 + + + + 199.130127 + + + + 197.688232 + + + + 197.207520 + + + + 197.688232 + + + + 198.168945 + + + + 198.649536 + + + + 198.168945 + + + + 198.168945 + + + + 198.168945 + + + + 197.207520 + + + + 197.207520 + + + + 197.207520 + + + + 197.207520 + + + + 198.168945 + + + + 197.688232 + + + + 197.688232 + + + + 199.130127 + + + + 200.091675 + + + + 201.052856 + + + + 201.052856 + + + + 201.533569 + + + + 200.091675 + + + + 201.052856 + + + + 200.091675 + + + + 199.610840 + + + + 196.726929 + + + + 196.246338 + + + + 195.284912 + + + + 194.804321 + + + + 194.804321 + + + + 195.284912 + + + + 197.688232 + + + + 198.168945 + + + + 197.688232 + + + + 197.688232 + + + + 198.168945 + + + + 198.649536 + + + + 198.649536 + + + + 199.130127 + + + + 199.610840 + + + + 200.091675 + + + + 201.052856 + + + + 201.052856 + + + + 202.494873 + + + + 204.417480 + + + + 206.340088 + + + + 207.782104 + + + + 210.666016 + + + + 213.069336 + + + + 214.511230 + + + + 214.030640 + + + + 213.550049 + + + + 214.511230 + + + + 215.953247 + + + + 217.395386 + + + + 220.759888 + + + + 221.240601 + + + + 221.240601 + + + + 221.240601 + + + + 220.279175 + + + + 219.317993 + + + + 217.875977 + + + + 217.875977 + + + + 218.356567 + + + + 218.356567 + + + + 217.395386 + + + + 218.356567 + + + + 222.682495 + + + + 227.008545 + + + + 231.334351 + + + + 238.544312 + + + + 234.699097 + + + + 231.334351 + + + + 229.892334 + + + + 228.931152 + + + + 228.450439 + + + + 227.969727 + + + + 226.047119 + + + + 222.201782 + + + + 221.240601 + + + + 215.953247 + + + + 214.030640 + + + + 212.108032 + + + + 212.588623 + + + + 211.627441 + + + + 207.782104 + + + + 206.340088 + + + + 204.417480 + + + + 204.417480 + + + + 204.417480 + + + + 204.898071 + + + + 205.859497 + + + + 206.340088 + + + + 207.301392 + + + + 207.782104 + + + + 206.820679 + + + + 206.340088 + + + + 205.378784 + + + + 205.859497 + + + + 207.782104 + + + + + + ACTIVE LOG 008 + + + 203.936890 + + + + 203.936890 + + + + 209.224121 + + + + 221.721191 + + + + + + ACTIVE LOG 009 + + + 218.837280 + + + + 198.649536 + + + + 217.395386 + + + + 209.704834 + + + + 208.262817 + + + + 208.262817 + + + + + + ACTIVE LOG 010 + + + 221.721191 + + + + 219.317993 + + + + 218.837280 + + + + 218.837280 + + + + 218.837280 + + + + 217.875977 + + + + 217.875977 + + + + 217.395386 + + + + 218.356567 + + + + 218.356567 + + + + 217.875977 + + + + 217.875977 + + + + 219.317993 + + + + 220.279175 + + + + 220.279175 + + + + 220.279175 + + + + 220.279175 + + + + 219.317993 + + + + 217.395386 + + + + 216.914673 + + + + 216.433960 + + + + 214.991943 + + + + 215.953247 + + + + 216.433960 + + + + 216.914673 + + + + 216.433960 + + + + 216.914673 + + + + 215.953247 + + + + 215.953247 + + + + 216.914673 + + + + 217.875977 + + + + 218.356567 + + + + 218.837280 + + + + 220.759888 + + + + 222.682495 + + + + 221.240601 + + + + 220.759888 + + + + 219.798584 + + + + 220.279175 + + + + 220.759888 + + + + 221.721191 + + + + 222.682495 + + + + 224.124512 + + + + 227.008545 + + + + 225.566528 + + + + 223.643799 + + + + 223.163208 + + + + 223.163208 + + + + 224.605225 + + + + 225.085938 + + + + 225.085938 + + + + 225.566528 + + + + 225.566528 + + + + 227.489136 + + + + 227.969727 + + + + 228.931152 + + + + 230.373047 + + + + 231.334351 + + + + 231.814941 + + + + 228.931152 + + + + 227.008545 + + + + 225.566528 + + + + 225.566528 + + + + 225.566528 + + + + 226.527832 + + + + 226.527832 + + + + 226.527832 + + + + 227.489136 + + + + 229.892334 + + + + 230.853760 + + + + 229.892334 + + + + 228.931152 + + + + 229.892334 + + + + 229.892334 + + + + 230.853760 + + + + 232.295776 + + + + 233.257080 + + + + 232.776489 + + + + 231.814941 + + + + 230.853760 + + + + 230.853760 + + + + 229.892334 + + + + 229.411743 + + + + 228.450439 + + + + 228.450439 + + + + 228.450439 + + + + 227.008545 + + + + 226.527832 + + + + 226.527832 + + + + 226.527832 + + + + 226.527832 + + + + 227.489136 + + + + 227.969727 + + + + 228.931152 + + + + 229.892334 + + + + 228.931152 + + + + 228.931152 + + + + 228.450439 + + + + 227.969727 + + + + 229.411743 + + + + 230.373047 + + + + 231.334351 + + + + 231.334351 + + + + 231.334351 + + + + 232.776489 + + + + 233.737671 + + + + 234.218384 + + + + 235.660278 + + + + 235.660278 + + + + 237.582886 + + + + 237.582886 + + + + 236.621704 + + + + 236.621704 + + + + 236.621704 + + + + 244.312256 + + + + 241.908936 + + + + 239.505493 + + + + 238.544312 + + + + 236.621704 + + + + 234.699097 + + + + 233.257080 + + + + 233.257080 + + + + 232.776489 + + + + 232.776489 + + + + 233.737671 + + + + 232.776489 + + + + 234.699097 + + + + 236.621704 + + + + 237.582886 + + + + 238.063599 + + + + 238.063599 + + + + 239.024902 + + + + 239.024902 + + + + 239.505493 + + + + 239.986206 + + + + 241.428223 + + + + 241.428223 + + + + 241.428223 + + + + 241.428223 + + + + 241.428223 + + + + 241.428223 + + + + 241.428223 + + + + 241.908936 + + + + 242.870239 + + + + 243.350830 + + + + 245.273438 + + + + 246.234863 + + + + 247.196045 + + + + 248.157593 + + + + 250.560791 + + + + 252.002808 + + + + 253.925415 + + + + 252.963989 + + + + 252.483398 + + + + 251.522095 + + + + 250.080200 + + + + 249.599487 + + + + 249.599487 + + + + 250.080200 + + + + 250.560791 + + + + 249.599487 + + + + 250.080200 + + + + 250.560791 + + + + 250.080200 + + + + 248.157593 + + + + 248.157593 + + + + 248.157593 + + + + 246.715454 + + + + 246.715454 + + + + 249.599487 + + + + 251.522095 + + + + 251.522095 + + + + 251.041382 + + + + 251.041382 + + + + 251.041382 + + + + 251.041382 + + + + 251.041382 + + + + 250.080200 + + + + 250.560791 + + + + 251.522095 + + + + 250.080200 + + + + 249.118774 + + + + 249.599487 + + + + 251.041382 + + + + 251.041382 + + + + 252.963989 + + + + 253.444702 + + + + 253.925415 + + + + 253.925415 + + + + 253.925415 + + + + 253.925415 + + + + 252.002808 + + + + 251.522095 + + + + 251.522095 + + + + 251.522095 + + + + 252.002808 + + + + 252.483398 + + + + 255.367310 + + + + 257.290039 + + + + 259.693359 + + + + 258.731934 + + + + 258.731934 + + + + 258.731934 + + + + 257.770752 + + + + 258.731934 + + + + 259.693359 + + + + 259.212646 + + + + 259.212646 + + + + 259.693359 + + + + 259.212646 + + + + 258.251343 + + + + 258.251343 + + + + 258.251343 + + + + 259.212646 + + + + 259.693359 + + + + 260.173950 + + + + 260.654541 + + + + 261.135254 + + + + 262.096558 + + + + 262.577148 + + + + 262.577148 + + + + 262.577148 + + + + 263.538574 + + + + 263.057861 + + + + 262.577148 + + + + 263.538574 + + + + 265.461304 + + + + 265.941895 + + + + 264.980591 + + + + 265.461304 + + + + 268.825806 + + + + 275.074463 + + + + 278.919678 + + + + 278.919678 + + + + 276.997070 + + + + 275.555054 + + + + 274.113037 + + + + 272.671143 + + + + 269.787109 + + + + 271.229126 + + + + 271.709717 + + + + 272.190430 + + + + 272.671143 + + + + 272.190430 + + + + 271.709717 + + + + 271.229126 + + + + 270.748413 + + + + 269.787109 + + + + 269.306519 + + + + 268.825806 + + + + 269.306519 + + + + 270.267700 + + + + 271.229126 + + + + 272.190430 + + + + 272.190430 + + + + 272.190430 + + + + 274.113037 + + + + 276.035645 + + + + 279.400269 + + + + 279.400269 + + + + 279.400269 + + + + 281.322998 + + + + 281.803589 + + + + 280.361694 + + + + 280.842407 + + + + 279.400269 + + + + 279.400269 + + + + 278.919678 + + + + 278.919678 + + + + 280.842407 + + + + 279.880859 + + + + 279.400269 + + + + 279.400269 + + + + 279.400269 + + + + 279.400269 + + + + 283.726196 + + + + 283.245605 + + + + 283.726196 + + + + 283.245605 + + + + 284.206909 + + + + 286.129517 + + + + 289.013550 + + + + 289.494141 + + + + 291.897461 + + + + 297.665405 + + + + 298.626709 + + + + 304.875244 + + + + 303.913940 + + + + 301.510620 + + + + 300.549316 + + + + 300.549316 + + + + 300.068726 + + + + 300.068726 + + + + 299.107300 + + + + 296.223511 + + + + 295.261963 + + + + 292.858765 + + + + 292.378174 + + + + 292.858765 + + + + 292.858765 + + + + 293.339355 + + + + 294.781372 + + + + 294.300781 + + + + 293.820068 + + + + 293.820068 + + + + 293.820068 + + + + 294.300781 + + + + 304.875244 + + + + 307.759277 + + + + 310.643066 + + + + 313.527222 + + + + 314.969116 + + + + 318.333618 + + + + 318.814331 + + + + 320.737061 + + + + 323.620972 + + + + 329.869507 + + + + 332.753540 + + + + 333.234131 + + + + 336.118164 + + + + 339.482666 + + + + 341.405273 + + + + 342.366699 + + + + 346.692627 + + + + 349.576538 + + + + 347.653931 + + + + 344.289429 + + + + 343.808594 + + + + 343.808594 + + + + 345.731323 + + + + 345.731323 + + + + 346.212036 + + + + 344.770020 + + + + 343.808594 + + + + 343.327881 + + + + 342.847290 + + + + 343.808594 + + + + 349.095825 + + + + 350.537842 + + + + 352.460571 + + + + 354.863770 + + + + 355.825195 + + + + 355.825195 + + + + 357.267090 + + + + 359.189697 + + + + 361.593140 + + + + 362.554321 + + + + 363.996338 + + + + 364.957642 + + + + 366.399536 + + + + 367.841553 + + + + 369.764282 + + + + 373.128906 + + + + 374.570801 + + + + 376.012817 + + + + 377.935425 + + + + 376.974243 + + + + 375.051514 + + + + 374.570801 + + + + 372.648193 + + + + 372.167480 + + + + 374.090088 + + + + 375.532104 + + + + 375.532104 + + + + 374.570801 + + + + 373.128906 + + + + 372.167480 + + + + 368.802979 + + + + 366.880249 + + + + 362.554321 + + + + 358.708984 + + + + 356.305786 + + + + 355.825195 + + + + 357.747803 + + + + 358.228394 + + + + 359.670410 + + + + 359.670410 + + + + 363.515747 + + + + 365.438354 + + + + 366.880249 + + + + 365.438354 + + + + 364.476929 + + + + 362.073730 + + + + 361.593140 + + + + 361.593140 + + + + 365.918945 + + + + 373.609497 + + + + 381.780640 + + + + 384.664795 + + + + 384.184082 + + + + 384.184082 + + + + 383.222656 + + + + 381.780640 + + + + 381.300049 + + + + 382.261353 + + + + 383.222656 + + + + 386.587402 + + + + 389.951904 + + + + 396.681152 + + + + 401.487793 + + + + 407.736328 + + + + 413.984863 + + + + 415.426880 + + + + 409.178345 + + + + 399.565063 + + + + 391.874512 + + + + 389.471191 + + + + 390.913208 + + + + 394.758545 + + + + 397.161743 + + + + 401.007080 + + + + 404.371704 + + + + 407.255615 + + + + 407.255615 + + + + 406.294312 + + + + 407.255615 + + + + 408.697632 + + + + 411.100952 + + + + 414.465454 + + + + 417.830200 + + + + 420.714111 + + + + 422.636719 + + + + 424.078735 + + + + 423.598022 + + + + 423.598022 + + + + 423.117432 + + + + 425.040161 + + + + 428.404663 + + + + 429.365967 + + + + 427.443359 + + + + 428.404663 + + + + 429.846558 + + + + 431.288574 + + + + 433.211304 + + + + 435.133911 + + + + 434.653320 + + + + 434.172607 + + + + 433.691895 + + + + 433.211304 + + + + 432.250000 + + + + 433.211304 + + + + 434.653320 + + + + 436.095215 + + + + 436.575928 + + + + 436.575928 + + + + 436.095215 + + + + 434.653320 + + + + 431.769165 + + + + 430.327271 + + + + 427.443359 + + + + 426.962769 + + + + 423.598022 + + + + 419.272217 + + + + 415.907471 + + + + 410.620239 + + + + 407.736328 + + + + 407.255615 + + + + 405.333008 + + + + 403.410400 + + + + 402.449097 + + + + 402.929688 + + + + 404.371704 + + + + 405.333008 + + + + 405.333008 + + + + 408.697632 + + + + 411.581665 + + + + 414.465454 + + + + 414.946167 + + + + 415.907471 + + + + 416.388184 + + + + 413.984863 + + + + 410.620239 + + + + 409.659058 + + + + 408.697632 + + + + 406.294312 + + + + 405.333008 + + + + 405.333008 + + + + 405.333008 + + + + 405.333008 + + + + 405.333008 + + + + 404.852295 + + + + 405.333008 + + + + 405.813721 + + + + 409.659058 + + + + 412.542847 + + + + 410.620239 + + + + 409.178345 + + + + 408.697632 + + + + 408.697632 + + + + 407.736328 + + + + 406.294312 + + + + 404.852295 + + + + 403.410400 + + + + 402.929688 + + + + 402.449097 + + + + 401.487793 + + + + 400.526489 + + + + 398.603760 + + + + 396.681152 + + + + 394.758545 + + + + 393.797241 + + + + 393.316528 + + + + 393.316528 + + + + 394.758545 + + + + 394.277954 + + + + 392.835938 + + + + 392.355347 + + + + 389.951904 + + + + 384.664795 + + + + 381.780640 + + + + 380.338745 + + + + 375.051514 + + + + 372.648193 + + + + 369.283691 + + + + 353.902588 + + + + 347.653931 + + + + 338.521484 + + + + 332.753540 + + + + 330.350220 + + + + 328.427612 + + + + 320.256348 + + + + 317.853027 + + + + 316.891724 + + + + 316.411011 + + + + 313.046509 + + + + 309.681885 + + + + 309.201172 + + + + 309.201172 + + + + 308.239868 + + + + 306.317261 + + + + 304.875244 + + + + 302.471924 + + + + 302.952515 + + + + 304.394653 + + + + 305.836670 + + + + 307.759277 + + + + 311.123779 + + + + 313.527222 + + + + 315.930420 + + + + 320.256348 + + + + 325.543579 + + + + 328.427612 + + + + 334.195435 + + + + 337.079468 + + + + 341.405273 + + + + 344.770020 + + + + 347.653931 + + + + 349.095825 + + + + 350.537842 + + + + 350.537842 + + + + 351.018433 + + + + 351.979858 + + + + 351.018433 + + + + 350.057251 + + + + 349.576538 + + + + 350.057251 + + + + 350.057251 + + + + 350.057251 + + + + 349.576538 + + + + 349.095825 + + + + 348.615234 + + + + 347.653931 + + + + 348.615234 + + + + 349.095825 + + + + 350.057251 + + + + 354.383179 + + + + 357.267090 + + + + 360.631714 + + + + 365.438354 + + + + 368.322266 + + + + 370.244873 + + + + 373.128906 + + + + 374.570801 + + + + 374.570801 + + + + 373.609497 + + + + 368.322266 + + + + 370.725586 + + + + 372.167480 + + + + 372.648193 + + + + 373.609497 + + + + 374.570801 + + + + 375.051514 + + + + 375.532104 + + + + 377.935425 + + + + 378.416138 + + + + 379.858032 + + + + 380.338745 + + + + 381.780640 + + + + 382.261353 + + + + 386.106689 + + + + 387.067993 + + + + 388.029297 + + + + 388.029297 + + + + 388.510010 + + + + 388.029297 + + + + 388.510010 + + + + 388.510010 + + + + 389.471191 + + + + 389.951904 + + + + 392.355347 + + + + 393.797241 + + + + 394.758545 + + + + 397.161743 + + + + 400.045898 + + + + 400.526489 + + + + 401.487793 + + + + 403.410400 + + + + 404.371704 + + + + 404.371704 + + + + 403.891113 + + + + 409.178345 + + + + 414.465454 + + + + 416.868896 + + + + 416.868896 + + + + 418.310791 + + + + 423.117432 + + + + 430.327271 + + + + 436.095215 + + + + 440.901855 + + + + 444.266479 + + + + 447.150269 + + + + 447.150269 + + + + 445.227661 + + + + 444.266479 + + + + 443.305054 + + + + 443.305054 + + + + 442.824463 + + + + 440.901855 + + + + 438.979126 + + + + 438.979126 + + + + 439.940430 + + + + 440.901855 + + + + 442.824463 + + + + 443.785767 + + + + 441.863159 + + + + 440.901855 + + + + 440.421265 + + + + 445.708374 + + + + 448.111816 + + + + 450.515015 + + + + 450.515015 + + + + 450.034424 + + + + 447.630981 + + + + 443.785767 + + + + 439.459717 + + + + 437.056519 + + + + 435.614502 + + + + 435.614502 + + + + 435.614502 + + + + 435.614502 + + + + 435.133911 + + + + 434.653320 + + + + 434.653320 + + + + 434.172607 + + + + 433.691895 + + + + 433.691895 + + + + 432.730713 + + + + 432.250000 + + + + 430.807983 + + + + 427.443359 + + + + 423.598022 + + + + 420.714111 + + + + 417.349609 + + + + 415.907471 + + + + 414.465454 + + + + 413.504272 + + + + 411.100952 + + + + 406.294312 + + + + 401.487793 + + + + 398.123169 + + + + 395.239136 + + + + 392.835938 + + + + 389.951904 + + + + 389.471191 + + + + 388.990601 + + + + 388.990601 + + + + 388.510010 + + + + 387.548584 + + + + 385.625977 + + + + 384.184082 + + + + 384.184082 + + + + 384.664795 + + + + 384.664795 + + + + 385.145386 + + + + 384.664795 + + + + 384.184082 + + + + 384.184082 + + + + 382.742065 + + + + 382.261353 + + + + 381.780640 + + + + 381.780640 + + + + 382.261353 + + + + 382.742065 + + + + 383.222656 + + + + 383.703247 + + + + 385.625977 + + + + 386.587402 + + + + 386.587402 + + + + 386.587402 + + + + 388.029297 + + + + 391.393799 + + + + 391.393799 + + + + 391.393799 + + + + 391.393799 + + + + 393.316528 + + + + 390.432617 + + + + 381.300049 + + + + 371.206299 + + + + 368.322266 + + + + 370.725586 + + + + 373.128906 + + + + 374.570801 + + + + 375.532104 + + + + 375.532104 + + + + 375.532104 + + + + 375.532104 + + + + 375.051514 + + + + 373.609497 + + + + 368.802979 + + + + 373.128906 + + + + 374.570801 + + + + 376.974243 + + + + 378.416138 + + + + 381.780640 + + + + 385.145386 + + + + 388.990601 + + + + 388.510010 + + + + 384.184082 + + + + 379.858032 + + + + 385.625977 + + + + 384.184082 + + + + 379.858032 + + + + 381.300049 + + + + 379.377441 + + + + 373.609497 + + + + 366.399536 + + + + 364.476929 + + + + 360.151123 + + + + 357.747803 + + + + 357.267090 + + + + 353.421875 + + + + 348.134644 + + + + 344.770020 + + + + 340.444092 + + + + 339.963379 + + + + 338.521484 + + + + 335.637329 + + + + 335.156738 + + + + 337.560059 + + + + 342.366699 + + + + 341.885986 + + + + 340.924683 + + + + 340.924683 + + + + 340.924683 + + + + 343.327881 + + + + 344.770020 + + + + 345.250610 + + + + 345.731323 + + + + 347.653931 + + + + 347.173218 + + + + 346.692627 + + + + 345.250610 + + + + 343.808594 + + + + 343.327881 + + + + 341.405273 + + + + 340.924683 + + + + 340.924683 + + + + 339.482666 + + + + 339.482666 + + + + 338.040771 + + + + 337.079468 + + + + 336.118164 + + + + 336.118164 + + + + 336.118164 + + + + 336.118164 + + + + 336.118164 + + + + 336.598877 + + + + 334.195435 + + + + 334.195435 + + + + 335.156738 + + + + 335.156738 + + + + 336.598877 + + + + 337.079468 + + + + 336.598877 + + + + 338.040771 + + + + 338.521484 + + + + 340.444092 + + + + 341.405273 + + + + 341.885986 + + + + 342.847290 + + + + 341.405273 + + + + 338.521484 + + + + 335.637329 + + + + 335.637329 + + + + 336.118164 + + + + 335.637329 + + + + 335.156738 + + + + 335.156738 + + + + 336.118164 + + + + 336.598877 + + + + 337.079468 + + + + 337.079468 + + + + 337.079468 + + + + 336.118164 + + + + 334.676147 + + + + 335.156738 + + + + 336.118164 + + + + 336.598877 + + + + 351.979858 + + + + 355.344482 + + + + 356.786377 + + + + 360.151123 + + + + 361.593140 + + + + 363.035034 + + + + 365.438354 + + + + 370.244873 + + + + 375.051514 + + + + 378.896851 + + + + 386.106689 + + + + 386.587402 + + + + 388.029297 + + + + 388.029297 + + + + 389.951904 + + + + 390.913208 + + + + 392.835938 + + + + 392.835938 + + + + 393.316528 + + + + 393.316528 + + + + 393.316528 + + + + 393.797241 + + + + 394.277954 + + + + 394.277954 + + + + 394.758545 + + + + 393.316528 + + + + 393.316528 + + + + 393.797241 + + + + 392.355347 + + + + 389.471191 + + + + 388.510010 + + + + 386.587402 + + + + 387.067993 + + + + 381.300049 + + + + 379.377441 + + + + 376.493530 + + + + 375.532104 + + + + 372.167480 + + + + 368.322266 + + + + 365.918945 + + + + 365.918945 + + + + 364.476929 + + + + 362.554321 + + + + 358.708984 + + + + 358.228394 + + + + 357.267090 + + + + 361.593140 + + + + 342.847290 + + + + 343.327881 + + + + 341.885986 + + + + 340.924683 + + + + 342.847290 + + + + 342.366699 + + + + 342.847290 + + + + 346.692627 + + + + 347.653931 + + + + 350.057251 + + + + 350.537842 + + + + 353.421875 + + + + 355.344482 + + + + 366.399536 + + + + 372.167480 + + + + 372.167480 + + + + 368.802979 + + + + 368.802979 + + + + 368.802979 + + + + 368.322266 + + + + 371.206299 + + + + 371.206299 + + + + 370.244873 + + + + 371.206299 + + + + + diff --git a/reference/googmapjs.sh b/reference/googmapjs.sh index 6ce53183b..486c4f560 100644 --- a/reference/googmapjs.sh +++ b/reference/googmapjs.sh @@ -1,5 +1,5 @@ -FROM="233 S. Wacker, Chicago, IL" -TO="1060 W. Addison, Chicago, IL" +FROM="233 S. Upper Wacker Dr, Chicago, IL" +TO="1060 W. Addison St, Chicago, IL" wget -O - "http://maps.google.com/maps?q=$FROM to $TO&output=js" 2>/dev/null diff --git a/reference/igc1_gpx.out b/reference/igc1_gpx.out index 25c86bb95..759ad2152 100644 --- a/reference/igc1_gpx.out +++ b/reference/igc1_gpx.out @@ -9,368 +9,373 @@ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/ 0001 IGCDATE000000: - + TAKEOFF BORAH + BORAH - + START BORAH + BORAH - + TURN01 BALDWI + BALDWI - + FINISH MANAIR + MANAIR - + LANDING MANAIR + MANAIR GNSSALTTRK IGCHDRS~HFPLTPILOT:CHRIS JONES~ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/reference/igc2_gpx.out b/reference/igc2_gpx.out index d841eac8e..1a5fb96ed 100644 --- a/reference/igc2_gpx.out +++ b/reference/igc2_gpx.out @@ -9,74 +9,80 @@ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/ 0001 IGCDATE160701: 500KTri - + TAKEOFF LashamClubhouse + LashamClubhouse - + START LashamStart S Start + LashamStart S Start - + TURN01 Sarnesfield TP1 + Sarnesfield TP1 - + TURN02 NormanCross TP2 + NormanCross TP2 - + FINISH LashamStart S Finish + LashamStart S Finish - + LANDING LashamClubhouse + LashamClubhouse PRESALTTRK IGCHDRS~HFFXA035~HFPLTPILOT:Bill Bloggs~HFGTYGLIDERTYPE:Schleicher ASH-25~HFGIDGLIDERID:ABCD-1234~HFDTM100GPSDATUM:WGS-1984~HFRFWFIRMWAREVERSION:6.4~HFRHWHARDWAREVERSION:3.0~HFFTYFRTYPE:Manufacturer Model~HFGPSMarconiCanada:Superstar 12ch max10000m~HFPRSPRESSALTSENSOR:Sensyn XYZ1111 max11000m~HFCIDCOMPETITIONID:XYZ-78910~HFCCLCOMPETITIONCLASS:15mMotor Glider~HFSCMSECONDCREW:JohnSmith~ - + 280.000000 - + 288.000000 - + 290.000000 - + 290.000000 - + 291.000000 - + 291.000000 - + 293.000000 - + 494.000000 - + 496.000000 @@ -86,39 +92,39 @@ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/ GNSSALTTRK IGCHDRS~HFFXA035~HFPLTPILOT:Bill Bloggs~HFGTYGLIDERTYPE:Schleicher ASH-25~HFGIDGLIDERID:ABCD-1234~HFDTM100GPSDATUM:WGS-1984~HFRFWFIRMWAREVERSION:6.4~HFRHWHARDWAREVERSION:3.0~HFFTYFRTYPE:Manufacturer Model~HFGPSMarconiCanada:Superstar 12ch max10000m~HFPRSPRESSALTSENSOR:Sensyn XYZ1111 max11000m~HFCIDCOMPETITIONID:XYZ-78910~HFCCLCOMPETITIONCLASS:15mMotor Glider~HFSCMSECONDCREW:JohnSmith~ - + 421.000000 - + 429.000000 - + 432.000000 - + 430.000000 - + 432.000000 - + 435.000000 - + 435.000000 - + 436.000000 - + 439.000000 diff --git a/reference/ignoreicons.usr b/reference/ignoreicons.usr new file mode 100644 index 0000000000000000000000000000000000000000..f3724e4b313be9f9c62eee41c9f958a3d6b9efb4 GIT binary patch literal 2901 zcma*pe`u9e9LMqJx#kv0{wQ!pWDAs$q+zLlgc+DQ$ BtfuoWmz#G#aBYZlR;xtZ zipms0?S~?`$W;6_GsUvn)G#9`V}FDRl1f@yWTW)?1z-pH#Jrkj!oqF_*`xrMTzJ} zJ!*1OO-*4*Q(c^l1{EcvWqQ36dcF8Xp&L*+1QrXOpibBWs)Ub0xv&L1Eo=tG!a6Wn zSPdo$Z-Vhc8yGFD03(D}aJ$e9h6;^fpimF`3$-AvSz8Etg>rCNCPlB_;W8jo9 z3G@i}fs?{0@U1W$d?O46M}&dk3n3pI7Gl7R_G&rfPlUg~PT>;xP++Cw?Sik`Aq?QE zUBazkzi=D)RJaQq5IhW;#)Zm6z(c2kZozNywNOIkxKIYD%m+t>n$X!Z##=0-(j_bp zO`drwYpHxGydU6&O169$7a;TAAU7zRp(!q9XtNUAa(ED#<9+~*NcD?APw zg;`*UFbA{>^8f>z3swowf_0(KCZU1~tNc7*-3@j^ipoLZ1;9i#2fP~44w%(<0G-zZ z4uxsesmi!Zx$AQ7jx#yr?khmCN0DjHN>E?go8x#~ya>*p^NZyD?3sJ{PV4X8TW& zmAikla>p9^KBToD&*IMigsWV+PBvL1XOlJZP+3qP8dNgboWh++S1N?U?Y?}*!L;eilO}(|4@E$5m!gqjaIR==+!+?3-2bkv_fOvKQ zQt&QdtFH!}0Ivr)AoOu$$c{tAkD!0@sQ5>a%geZmq&x+9#0_fA0Ch%bZ9TIb^t@!PEVbz`%TtF=n4^oPI;N&ksTY z_)+jfe-etQoEFA_Gr|OLR`B_APMAXFqTuuAvfyunUcr;VL0v%~zMVW#1%jt;xUht# zQG!qY`vuSQ140{3e6aazVY=X-l9_@}q-TUp^hpU@!6IQN;74jd$b2sHq1;Vnx!|K| MrEro;yWnl}AAo1&&;S4c literal 0 HcmV?d00001 diff --git a/reference/lowrance.usr b/reference/lowrance.usr index 1982f8a1a27e915833378db2710bd82c8eac9f02..32b2ea607f0f12385a04786ca713d70456d34f61 100644 GIT binary patch delta 88 ycmaFJ^pI(S5(@(ZgV{tiDD4BKi=gxjD7_C#KY`Gbxfr1g14bo&kO}HQ0tx`*4GpUR delta 88 ycmaFJ^pI(S63doc3&DwMP}&Dd7eVP6PGlAQRLX-~a&bMHqho diff --git a/reference/mxf.mxf b/reference/mxf.mxf index 98d93d1a0..ea6d6088e 100644 --- a/reference/mxf.mxf +++ b/reference/mxf.mxf @@ -1,9 +1,9 @@ -35.97203, -87.13470, "Mountain Bike Heaven by susy1313", "GCEBB", "Mountain Bike Heaven by susy1313", ff0000, 47 -36.09068, -86.67955, "The Troll by a182pilot & Family", "GC1A37", "The Troll by a182pilot & Family", ff0000, 47 -35.99627, -86.62012, "Dive Bomber by JoGPS & family", "GC1C2B", "Dive Bomber by JoGPS & family", ff0000, 47 -36.03848, -86.64862, "FOSTER by JoGPS & Family", "GC25A9", "FOSTER by JoGPS & Family", ff0000, 47 -36.11218, -86.74177, "Logan Lighthouse by JoGps & Family", "GC2723", "Logan Lighthouse by JoGps & Family", ff0000, 47 -36.06408, -86.79052, "Ganier Cache by Susy1313", "GC2B71", "Ganier Cache by Susy1313", ff0000, 47 -36.08777, -86.80973, "Shy's Hill by FireFighterEng33", "GC309F", "Shy's Hill by FireFighterEng33", ff0000, 47 -36.05750, -86.89200, "GittyUp by JoGPS / Warner Parks", "GC317A", "GittyUp by JoGPS / Warner Parks", ff0000, 47 -36.08280, -86.86728, "Inlighting by JoGPS / Warner Parks", "GC317D", "Inlighting by JoGPS / Warner Parks", ff0000, 47 +35.97203, -87.13470, Mountain Bike Heaven by susy1313, GCEBB, Mountain Bike Heaven by susy1313, ff0000, 47 +36.09068, -86.67955, The Troll by a182pilot & Family, GC1A37, The Troll by a182pilot & Family, ff0000, 47 +35.99627, -86.62012, Dive Bomber by JoGPS & family, GC1C2B, Dive Bomber by JoGPS & family, ff0000, 47 +36.03848, -86.64862, FOSTER by JoGPS & Family, GC25A9, FOSTER by JoGPS & Family, ff0000, 47 +36.11218, -86.74177, Logan Lighthouse by JoGps & Family, GC2723, Logan Lighthouse by JoGps & Family, ff0000, 47 +36.06408, -86.79052, Ganier Cache by Susy1313, GC2B71, Ganier Cache by Susy1313, ff0000, 47 +36.08777, -86.80973, Shy's Hill by FireFighterEng33, GC309F, Shy's Hill by FireFighterEng33, ff0000, 47 +36.05750, -86.89200, GittyUp by JoGPS / Warner Parks, GC317A, GittyUp by JoGPS / Warner Parks, ff0000, 47 +36.08280, -86.86728, Inlighting by JoGPS / Warner Parks, GC317D, Inlighting by JoGPS / Warner Parks, ff0000, 47 diff --git a/reference/route/bcr-sample.bcr b/reference/route/bcr-sample.bcr new file mode 100644 index 000000000..72a9ec49d --- /dev/null +++ b/reference/route/bcr-sample.bcr @@ -0,0 +1,36 @@ +[CLIENT] +REQUEST=TRUE +ROUTENAME=DE_Plauen-Leipzig +DESCRIPTIONLINES=1 +DESCRIPTION1= +STATION1=Standort,999999999 +STATION2=Standort,999999999 +STATION3=Standort,999999999 +STATION4=Standort,999999999 +STATION5=Standort,999999999 +STATION6=Standort,999999999 +STATION7=Standort,999999999 +STATION8=Standort,999999999 +STATION9=Standort,999999999 +[COORDINATES] +STATION1=1346067,6524736 +STATION2=1346265,6524980 +STATION3=1346113,6525659 +STATION4=1370788,6559102 +STATION5=1382050,6589961 +STATION6=1384671,6608819 +STATION7=1389101,6644184 +STATION8=1377578,6656081 +STATION9=1379831,6669676 +[DESCRIPTION] +STATION1=bei D 08527,Neundorf,,0, +STATION2=bei D 08523,Plauen/Possig,,0, +STATION3=bei D 08523,Plauen/Westend,,0, +STATION4=bei D 08427,Fraureuth/Beiersdorf,,0, +STATION5=bei D 04639,Ponitz/Merlach,,0, +STATION6=bei D 04600,Altenburg/Paditz,,0, +STATION7=bei D 04552,Borna/Gestewitz,,0, +STATION8=bei D 04564,Boehlen/Grossdeuben,,0, +STATION9=bei D 04317,Leipzig/Thonberg,,0, +[ROUTE] +ROUTERECT=1346067,6669676,1389101,6524736 diff --git a/reference/route/bcr-sample.gpx b/reference/route/bcr-sample.gpx new file mode 100644 index 000000000..eb4d8b21e --- /dev/null +++ b/reference/route/bcr-sample.gpx @@ -0,0 +1,121 @@ + + + + + + STATION1 + bei D 08527,Neundorf,,0, + bei D 08527,Neundorf,,0, + Waypoint + + + STATION2 + bei D 08523,Plauen/Possig,,0, + bei D 08523,Plauen/Possig,,0, + Waypoint + + + STATION3 + bei D 08523,Plauen/Westend,,0, + bei D 08523,Plauen/Westend,,0, + Waypoint + + + STATION4 + bei D 08427,Fraureuth/Beiersdorf,,0, + bei D 08427,Fraureuth/Beiersdorf,,0, + Waypoint + + + STATION5 + bei D 04639,Ponitz/Merlach,,0, + bei D 04639,Ponitz/Merlach,,0, + Waypoint + + + STATION6 + bei D 04600,Altenburg/Paditz,,0, + bei D 04600,Altenburg/Paditz,,0, + Waypoint + + + STATION7 + bei D 04552,Borna/Gestewitz,,0, + bei D 04552,Borna/Gestewitz,,0, + Waypoint + + + STATION8 + bei D 04564,Boehlen/Grossdeuben,,0, + bei D 04564,Boehlen/Grossdeuben,,0, + Waypoint + + + STATION9 + bei D 04317,Leipzig/Thonberg,,0, + bei D 04317,Leipzig/Thonberg,,0, + Waypoint + + + DE_Plauen-Leipzig + + STATION1 + bei D 08527,Neundorf,,0, + bei D 08527,Neundorf,,0, + Waypoint + + + STATION2 + bei D 08523,Plauen/Possig,,0, + bei D 08523,Plauen/Possig,,0, + Waypoint + + + STATION3 + bei D 08523,Plauen/Westend,,0, + bei D 08523,Plauen/Westend,,0, + Waypoint + + + STATION4 + bei D 08427,Fraureuth/Beiersdorf,,0, + bei D 08427,Fraureuth/Beiersdorf,,0, + Waypoint + + + STATION5 + bei D 04639,Ponitz/Merlach,,0, + bei D 04639,Ponitz/Merlach,,0, + Waypoint + + + STATION6 + bei D 04600,Altenburg/Paditz,,0, + bei D 04600,Altenburg/Paditz,,0, + Waypoint + + + STATION7 + bei D 04552,Borna/Gestewitz,,0, + bei D 04552,Borna/Gestewitz,,0, + Waypoint + + + STATION8 + bei D 04564,Boehlen/Grossdeuben,,0, + bei D 04564,Boehlen/Grossdeuben,,0, + Waypoint + + + STATION9 + bei D 04317,Leipzig/Thonberg,,0, + bei D 04317,Leipzig/Thonberg,,0, + Waypoint + + + diff --git a/reference/route/bcr-sample2.bcr b/reference/route/bcr-sample2.bcr new file mode 100644 index 000000000..bc84a3e75 --- /dev/null +++ b/reference/route/bcr-sample2.bcr @@ -0,0 +1,36 @@ +[CLIENT] +REQUEST=TRUE +ROUTENAME=DE_Plauen-Leipzig +DESCRIPTIONLINES=1 +DESCRIPTION1= +STATION1=Standort,999999999 +STATION2=Standort,999999999 +STATION3=Standort,999999999 +STATION4=Standort,999999999 +STATION5=Standort,999999999 +STATION6=Standort,999999999 +STATION7=Standort,999999999 +STATION8=Standort,999999999 +STATION9=Standort,999999999 +[COORDINATES] +STATION1=1346067,6524736 +STATION2=1346265,6524980 +STATION3=1346113,6525659 +STATION4=1370788,6559102 +STATION5=1382050,6589961 +STATION6=1384671,6608819 +STATION7=1389101,6644184 +STATION8=1377578,6656081 +STATION9=1379831,6669676 +[DESCRIPTION] +STATION1=bei D 08527,Neundorf,,0, +STATION2=bei D 08523,Plauen/Possig,,0, +STATION3=bei D 08523,Plauen/Westend,,0, +STATION4=bei D 08427,Fraureuth/Beiersdorf,,0, +STATION5=bei D 04639,Ponitz/Merlach,,0, +STATION6=bei D 04600,Altenburg/Paditz,,0, +STATION7=bei D 04552,Borna/Gestewitz,,0, +STATION8=bei D 04564,Boehlen/Grossdeuben,,0, +STATION9=bei D 04317,Leipzig/Thonberg,,0, +[ROUTE] +ROUTERECT=1346067,6669676,1389101,6524736 diff --git a/reference/route/tef_xml.mps b/reference/route/tef_xml.mps deleted file mode 100644 index 3021af6a3ee51ffecf420135d5561d4d6e92187b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12934 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 diff --git a/reference/route/tef_xml.sample.gpx b/reference/route/tef_xml.sample.gpx new file mode 100644 index 000000000..969fcc283 --- /dev/null +++ b/reference/route/tef_xml.sample.gpx @@ -0,0 +1,1498 @@ + + + + + + in Zedtwitz halb rechts halten auf B2 Hofer Strasse + B2 Hofer Strasse + B2 Hofer Strasse + + + bei D 95183 Töpen + B2\Hofer Strasse + B2\Hofer Strasse + + + bei D 07356 Lobenstein + L1095\Strasse der Jugend + L1095\Strasse der Jugend + + + bei D 07929 Saalburg-Ebersdorf/Saalburg + L1095 + L1095 + + + bei D07907 Burgk/Burgkhammer + K550 + K550 + + + bei D 07907 Burgk/Burgkhammer + Burgkhammer + Burgkhammer + + + bei D 07907 Burgk + L2357 + L2357 + + + bei D 07907 Schleiz/Möschlitz + L2357 + L2357 + + + bei D 07924 Ziegenrück + L2350\Plothental + L2350\Plothental + + + bei D 07389 Knau + L2349\Hauptstrasse + L2349\Hauptstrasse + + + bei D 07907 Plothen + L2349\Ortsstrasse + L2349\Ortsstrasse + + + bei D 07907 Schleiz/Langenbuch + K304\Lössauer Strasse + K304\Lössauer Strasse + + + bei D 07952 Pausa/Oberreichenau + S316\Am Mühlgraben + S316\Am Mühlgraben + + + bei D 08548 Syrau + B282/E49\Hauptstrasse + B282/E49\Hauptstrasse + + + bei D 08525 Plauen/Preißelpöhl + Martin-Luther-Strasse + Martin-Luther-Strasse + + + bei D 08541 Neuensalz + B173\Hauptstrasse + B173\Hauptstrasse + + + bei D 08543 Pöhl/Helmsgrün + K7880\Helmsgrün-Dorfstrasse + K7880\Helmsgrün-Dorfstrasse + + + bei D 08543 Herlasgrün + K7811\Herlasgrün-Dorfstrasse + K7811\Herlasgrün-Dorfstrasse + + + bei D 07985 Elsterberg/Reuth + S296\Netzschkauer Strasse + S296\Netzschkauer Strasse + + + bei D 08491 Netzschkau + S296\Elsterberger Strasse + S296\Elsterberger Strasse + + + bei D 08499 Mylau/Obermylau + B173\Netzschkauer Strasse + B173\Netzschkauer Strasse + + + bei D 08499 Mylau/Obermylau + B173\Robert-Georgi-Weg + B173\Robert-Georgi-Weg + + + bei D 08468 Reichenbach + B173\Friedensstrasse + B173\Friedensstrasse + + + bei D 08496 Neumark/Unterneumark + B173 + B173 + + + D 08115 Schönfels + K9351\Zwickauer Strasse + K9351\Zwickauer Strasse + + + bei D 08056 Zwickau/Bahnhofsvorstadt + B173\Reichenbacher Strasse + B173\Reichenbacher Strasse + + + bei D 09350 Lichtenstein + S255\Innere Zwickauer Strasse + S255\Innere Zwickauer Strasse + + + bei D 08118 Hartenstein + S284\Bahnhofstrasse + S284\Bahnhofstrasse + + + bei D 08228 Rodewisch + B169\Lindenstrasse + B169\Lindenstrasse + + + bei D 08209 Auerbach + B169\Göltzschtalstrasse + B169\Göltzschtalstrasse + + + bei D 08209 Auerbach/Beerheide + K7833\Rempesgrüner Strasse + K7833\Rempesgrüner Strasse + + + D 08304 Schönheide + S278\Hauptstrasse + S278\Hauptstrasse + + + bei D 08262 Tannenbergsthal/Jägersgrün + B283\Schönheider Strasse + B283\Schönheider Strasse + + + bei D 08262 Tannenbergsthal + B283\Klingenthaler Strasse + B283\Klingenthaler Strasse + + + bei D 08248 Klingenthal/Brunndöbra + S304\Falkensteiner Strasse + S304\Falkensteiner Strasse + + + bei D 08223 Grünbach-Muldenberg + S302/S304 + S302/S304 + + + bei D 08223 Grünbach + S304\Bahnhofstrasse + S304\Bahnhofstrasse + + + bei D 08261 Schöneck + S301 + S301 + + + bei D 08258 Markneukirchen/Friebus + B283 + B283 + + + bei D 08258 Landwüst + K7844\Rauner Strasse + K7844\Rauner Strasse + + + bei D 08626 Adorf/Jugelsburg + B92/E49 + B92/E49 + + + bei D 08626 Adorf + B92/E49\Oelsnitzer Strasse + B92/E49\Oelsnitzer Strasse + + + bei D 08606 Planschwitz + K7854\Oelsnitzer Strasse + K7854\Oelsnitzer Strasse + + + bei D 08538 Burgstein/Dröda + S310\Bobenneukirchener Strasse + S310\Bobenneukirchener Strasse + + + bei D 08538 Burgstein/Pirk + K7859 + K7859 + + + bei D 08538 Burgstein/Kemnitz + K7859 + K7859 + + + von bei D 95030 Hof/Innenstadt nach bei D95032 Hof + MOTORRAD Tourenplaner 2005/2006 9.50 + + bei D 95030 Hof/Innenstadt + B2 Schleizer Strasse + B2 Schleizer Strasse + + + in Zedtwitz halb rechts halten auf B2 Hofer Strasse + B2 Hofer Strasse + B2 Hofer Strasse + + + rechts abbiegen auf B2 + B2 + B2 + + + bei D 95183 Töpen + B2\Hofer Strasse + B2\Hofer Strasse + + + in Gefell links abbiegen auf B90 Friedensstrasse + B90 Friedensstrasse + B90 Friedensstrasse + + + in Lobenstein halb rechts halten auf B90 Hirschberger Strasse + B90 Hirschberger Strasse + B90 Hirschberger Strasse + + + geradeaus weiter auf Strasse der Jugend (L1095) + Strasse der Jugend (L1095) + Strasse der Jugend (L1095) + + + bei D 07356 Lobenstein + L1095\Strasse der Jugend + L1095\Strasse der Jugend + + + links abbiegen auf L1099 + L1099 + L1099 + + + rechts abbiegen + + + in Schönbrunn links abbiegen auf Schönbrunn + Schönbrunn + Schönbrunn + + + links abbiegen auf Schönbrunn + Schönbrunn + Schönbrunn + + + halb rechts halten auf Schönbrunn + Schönbrunn + Schönbrunn + + + geradeaus weiter auf L1095 + L1095 + L1095 + + + halb links halten auf L1095 + L1095 + L1095 + + + in Bellevue links abbiegen auf L1095 + L1095 + L1095 + + + in Saalburg geradeaus weiter auf L1095 + L1095 + L1095 + + + geradeaus weiter auf L1095 + L1095 + L1095 + + + links abbiegen auf L1095 + L1095 + L1095 + + + rechts abbiegen auf Schleizer Strasse (L1095) + Schleizer Strasse (L1095) + Schleizer Strasse (L1095) + + + bei D 07929 Saalburg-Ebersdorf/Saalburg + L1095 + L1095 + + + geradeaus weiter auf L1095 + L1095 + L1095 + + + links abbiegen + + + bei D07907 Burgk/Burgkhammer + K550 + K550 + + + rechts abbiegen auf L1101 + L1101 + L1101 + + + geradeaus weiter auf Burgkhammer + Burgkhammer + Burgkhammer + + + bei D 07907 Burgk/Burgkhammer + Burgkhammer + Burgkhammer + + + in Burgkhammer links abbiegen auf L1101 + L1101 + L1101 + + + links abbiegen + + + links abbiegen auf L1095 + L1095 + L1095 + + + links abbiegen auf Burgker Chaussee (L1101) + Burgker Chaussee (L1101) + Burgker Chaussee (L1101) + + + links abbiegen auf Burgker Strasse (L1101) + Burgker Strasse (L1101) + Burgker Strasse (L1101) + + + halb rechts halten auf L2357 + L2357 + L2357 + + + bei D 07907 Burgk + L2357 + L2357 + + + geradeaus weiter auf Burgker Strasse (L1101) + Burgker Strasse (L1101) + Burgker Strasse (L1101) + + + geradeaus weiter auf L2357 + L2357 + L2357 + + + bei D 07907 Schleiz/Möschlitz + L2357 + L2357 + + + links abbiegen + + + in Grochwitz halb rechts halten auf Mühlenstrasse + Mühlenstrasse + Mühlenstrasse + + + geradeaus weiter auf Sackgasse + Sackgasse + Sackgasse + + + geradeaus weiter + + + links abbiegen auf L1103 + L1103 + L1103 + + + links abbiegen auf L1103 + L1103 + L1103 + + + in Crispendorf halb rechts halten auf Ortsstrasse (L1103) + Ortsstrasse (L1103) + Ortsstrasse (L1103) + + + halb rechts halten auf Ortsstrasse (L1103) + Ortsstrasse (L1103) + Ortsstrasse (L1103) + + + halb rechts halten auf L1103 + L1103 + L1103 + + + in Ziegenrück halb links halten auf Schleizer Strasse (L1103) + Schleizer Strasse (L1103) + Schleizer Strasse (L1103) + + + rechts abbiegen auf Plothental (L2350) + Plothental (L2350) + Plothental (L2350) + + + bei D 07924 Ziegenrück + L2350\Plothental + L2350\Plothental + + + in Tausa halb links halten auf Tausa (L2350) + Tausa (L2350) + Tausa (L2350) + + + in Bucha links abbiegen auf Ortsstrasse (L2350) + Ortsstrasse (L2350) + Ortsstrasse (L2350) + + + rechts abbiegen auf L2350 + L2350 + L2350 + + + in Knau halb links halten auf Hauptstrasse (L2349) + Hauptstrasse (L2349) + Hauptstrasse (L2349) + + + bei D 07389 Knau + L2349\Hauptstrasse + L2349\Hauptstrasse + + + links abbiegen auf Hauptstrasse (L2349) + Hauptstrasse (L2349) + Hauptstrasse (L2349) + + + bei D 07907 Plothen + L2349\Ortsstrasse + L2349\Ortsstrasse + + + in Dittersdorf rechts abbiegen auf L1077 + L1077 + L1077 + + + rechts abbiegen auf Ziegelei + Ziegelei + Ziegelei + + + halb rechts halten auf B2 + B2 + B2 + + + in Oettersdorf links abbiegen auf Löhmaer Weg (K301) + Löhmaer Weg (K301) + Löhmaer Weg (K301) + + + rechts abbiegen auf Löhmaer Weg (K301) + Löhmaer Weg (K301) + Löhmaer Weg (K301) + + + links abbiegen auf Löhmaer Weg (K301) + Löhmaer Weg (K301) + Löhmaer Weg (K301) + + + rechts abbiegen + + + in Löhma links abbiegen auf Ortsstrasse + Ortsstrasse + Ortsstrasse + + + geradeaus weiter + + + in Kirschkau geradeaus weiter auf Ortsstrasse + Ortsstrasse + Ortsstrasse + + + rechts abbiegen auf Ortsstrasse + Ortsstrasse + Ortsstrasse + + + rechts abbiegen auf Ortsstrasse + Ortsstrasse + Ortsstrasse + + + links abbiegen auf Ortsstrasse + Ortsstrasse + Ortsstrasse + + + rechts abbiegen auf Ortsstrasse + Ortsstrasse + Ortsstrasse + + + geradeaus weiter auf B94 + B94 + B94 + + + rechts abbiegen auf B94 + B94 + B94 + + + links abbiegen auf Dorfstrasse + Dorfstrasse + Dorfstrasse + + + in Lössau links abbiegen + + + bei D 07907 Schleiz/Langenbuch + K304\Lössauer Strasse + K304\Lössauer Strasse + + + in Langenbuch links abbiegen auf Thierbacher Strasse (L2348) + Thierbacher Strasse (L2348) + Thierbacher Strasse (L2348) + + + geradeaus weiter + + + in Pausa/Vogtl. rechts abbiegen + + + rechts abbiegen auf Plauensche Strasse (S316) + Plauensche Strasse (S316) + Plauensche Strasse (S316) + + + in Oberreichenau halb links halten auf Am Mühlgraben (S316) + Am Mühlgraben (S316) + Am Mühlgraben (S316) + + + bei D 07952 Pausa/Oberreichenau + S316\Am Mühlgraben + S316\Am Mühlgraben + + + in Syrau halb rechts halten auf B282/E49 Hauptstrasse + B282/E49 Hauptstrasse + B282/E49 Hauptstrasse + + + bei D 08548 Syrau + B282/E49\Hauptstrasse + B282/E49\Hauptstrasse + + + rechts abbiegen auf Pausaer Strasse + Pausaer Strasse + Pausaer Strasse + + + rechts abbiegen auf B92/E49 Pausaer Strasse + B92/E49 Pausaer Strasse + B92/E49 Pausaer Strasse + + + in Plauen links abbiegen auf Martin-Luther-Strasse + Martin-Luther-Strasse + Martin-Luther-Strasse + + + bei D 08525 Plauen/Preißelpöhl + Martin-Luther-Strasse + Martin-Luther-Strasse + + + links abbiegen auf Lessingstrasse + Lessingstrasse + Lessingstrasse + + + links abbiegen auf B173 Hammerstrasse + B173 Hammerstrasse + B173 Hammerstrasse + + + links abbiegen auf Voigtsgrüner Weg (K6605) + Voigtsgrüner Weg (K6605) + Voigtsgrüner Weg (K6605) + + + rechts abbiegen auf Zum Plom + Zum Plom + Zum Plom + + + rechts abbiegen + + + in Neuensalz links abbiegen auf B169 + B169 + B169 + + + links abbiegen auf B169 Alte Plauener Strasse + B169 Alte Plauener Strasse + B169 Alte Plauener Strasse + + + geradeaus weiter auf B173 Hauptstrasse + B173 Hauptstrasse + B173 Hauptstrasse + + + bei D 08541 Neuensalz + B173\Hauptstrasse + B173\Hauptstrasse + + + in Thossfell geradeaus weiter auf B173 Hauptstrasse + B173 Hauptstrasse + B173 Hauptstrasse + + + geradeaus weiter auf B173 Hauptstrasse + B173 Hauptstrasse + B173 Hauptstrasse + + + links abbiegen auf Gansgrüner Strasse (K7880) + Gansgrüner Strasse (K7880) + Gansgrüner Strasse (K7880) + + + links abbiegen auf Gansgrüner Strasse (K7880) + Gansgrüner Strasse (K7880) + Gansgrüner Strasse (K7880) + + + in Gansgrün links abbiegen auf Dorfstrasse + Dorfstrasse + Dorfstrasse + + + rechts abbiegen auf Dorfstrasse (K7880) + Dorfstrasse (K7880) + Dorfstrasse (K7880) + + + halb rechts halten auf Dorfstrasse (K7880) + Dorfstrasse (K7880) + Dorfstrasse (K7880) + + + halb links halten + + + bei D 08543 Pöhl/Helmsgrün + K7880\Helmsgrün-Dorfstrasse + K7880\Helmsgrün-Dorfstrasse + + + in Helmsgrün halb rechts halten + + + in Herlasgrün rechts abbiegen auf Herlasgrün-Dorfstrasse (K7811) + Herlasgrün-Dorfstrasse (K7811) + Herlasgrün-Dorfstrasse (K7811) + + + bei D 08543 Herlasgrün + K7811\Herlasgrün-Dorfstrasse + K7811\Herlasgrün-Dorfstrasse + + + links abbiegen auf Herlasgrün-Christgrüner Strasse + Herlasgrün-Christgrüner Strasse + Herlasgrün-Christgrüner Strasse + + + geradeaus weiter auf Christgrüner Strasse + Christgrüner Strasse + Christgrüner Strasse + + + rechts abbiegen auf Dreckschänke (S297) + Dreckschänke (S297) + Dreckschänke (S297) + + + links abbiegen auf S298 + S298 + S298 + + + in Reimersgrün links abbiegen + + + halb rechts halten + + + in Coschütz rechts abbiegen auf Friedensstrasse (K7887) + Friedensstrasse (K7887) + Friedensstrasse (K7887) + + + links abbiegen auf S298 + S298 + S298 + + + rechts abbiegen auf Netzschkauer Strasse (S296) + Netzschkauer Strasse (S296) + Netzschkauer Strasse (S296) + + + bei D 07985 Elsterberg/Reuth + S296\Netzschkauer Strasse + S296\Netzschkauer Strasse + + + bei D 08491 Netzschkau + S296\Elsterberger Strasse + S296\Elsterberger Strasse + + + in Netzschkau links abbiegen auf Elsterberger Strasse (S296) + Elsterberger Strasse (S296) + Elsterberger Strasse (S296) + + + rechts abbiegen auf Strasse der Einheit (S296) + Strasse der Einheit (S296) + Strasse der Einheit (S296) + + + halb rechts halten auf Strasse der Einheit (S296) + Strasse der Einheit (S296) + Strasse der Einheit (S296) + + + links abbiegen auf B173 Plauener Strasse + B173 Plauener Strasse + B173 Plauener Strasse + + + bei D 08499 Mylau/Obermylau + B173\Netzschkauer Strasse + B173\Netzschkauer Strasse + + + bei D 08499 Mylau/Obermylau + B173\Robert-Georgi-Weg + B173\Robert-Georgi-Weg + + + in Reichenbach im Vogtland links abbiegen auf B173/B94 Klinkhardtstrasse + B173/B94 Klinkhardtstrasse + B173/B94 Klinkhardtstrasse + + + links abbiegen auf B173/B94 Dr.-Külz-Strasse + B173/B94 Dr.-Külz-Strasse + B173/B94 Dr.-Külz-Strasse + + + rechts abbiegen auf B173 Friedensstrasse + B173 Friedensstrasse + B173 Friedensstrasse + + + bei D 08468 Reichenbach + B173\Friedensstrasse + B173\Friedensstrasse + + + in Neumark geradeaus weiter auf B173 + B173 + B173 + + + geradeaus weiter auf B173 + B173 + B173 + + + bei D 08496 Neumark/Unterneumark + B173 + B173 + + + in Schönfels links abbiegen auf Stenner Strasse + Stenner Strasse + Stenner Strasse + + + geradeaus weiter auf Zwickauer Strasse (K9351) + Zwickauer Strasse (K9351) + Zwickauer Strasse (K9351) + + + D 08115 Schönfels + K9351\Zwickauer Strasse + K9351\Zwickauer Strasse + + + halb rechts halten auf Stenner Strasse + Stenner Strasse + Stenner Strasse + + + links abbiegen auf B173 Neumarker Strasse + B173 Neumarker Strasse + B173 Neumarker Strasse + + + bei D 08056 Zwickau/Bahnhofsvorstadt + B173\Reichenbacher Strasse + B173\Reichenbacher Strasse + + + in Zwickau rechts abbiegen auf B173 Humboldtstrasse + B173 Humboldtstrasse + B173 Humboldtstrasse + + + links abbiegen auf B173 Am Schwanenteich + B173 Am Schwanenteich + B173 Am Schwanenteich + + + rechts halten auf B173 Dr.-Friedrichs-Ring + B173 Dr.-Friedrichs-Ring + B173 Dr.-Friedrichs-Ring + + + geradeaus weiter auf B173 Glück-Auf-Brücke/Äussere Dresdner Strasse + B173 Glück-Auf-Brücke/Äussere Dresdner Strasse + B173 Glück-Auf-Brücke/Äussere Dresdner Strasse + + + rechts abbiegen auf Dresdner Strasse + Dresdner Strasse + Dresdner Strasse + + + geradeaus weiter auf Äussere Zwickauer Strasse + Äussere Zwickauer Strasse + Äussere Zwickauer Strasse + + + in Lichtenstein/Sa. geradeaus weiter auf Innere Zwickauer Strasse + Innere Zwickauer Strasse + Innere Zwickauer Strasse + + + bei D 09350 Lichtenstein + S255\Innere Zwickauer Strasse + S255\Innere Zwickauer Strasse + + + rechts abbiegen auf Hartensteiner Strasse (S255) + Hartensteiner Strasse (S255) + Hartensteiner Strasse (S255) + + + rechts abbiegen auf Hartensteiner Strasse (S255) + Hartensteiner Strasse (S255) + Hartensteiner Strasse (S255) + + + rechts abbiegen auf Hartensteiner Strasse (S255) + Hartensteiner Strasse (S255) + Hartensteiner Strasse (S255) + + + halb links halten auf Hartensteiner Strasse (S255) + Hartensteiner Strasse (S255) + Hartensteiner Strasse (S255) + + + geradeaus weiter auf S283 + S283 + S283 + + + rechts abbiegen auf S283 + S283 + S283 + + + in Hartenstein links abbiegen auf August-Bebel-Strasse (S283) + August-Bebel-Strasse (S283) + August-Bebel-Strasse (S283) + + + geradeaus weiter auf Bahnhofstrasse (S284) + Bahnhofstrasse (S284) + Bahnhofstrasse (S284) + + + bei D 08118 Hartenstein + S284\Bahnhofstrasse + S284\Bahnhofstrasse + + + rechts abbiegen + + + links abbiegen + + + in Stein rechts abbiegen auf Langenbacher Strasse (K9309) + Langenbacher Strasse (K9309) + Langenbacher Strasse (K9309) + + + halb links halten auf Wildbacher Strasse (K9309) + Wildbacher Strasse (K9309) + Wildbacher Strasse (K9309) + + + geradeaus weiter + + + halb rechts halten auf Hartensteiner Strasse (K9109) + Hartensteiner Strasse (K9109) + Hartensteiner Strasse (K9109) + + + in Wildbach rechts abbiegen auf Hartensteiner Strasse (K9109) + Hartensteiner Strasse (K9109) + Hartensteiner Strasse (K9109) + + + links abbiegen auf Silberbachstrasse + Silberbachstrasse + Silberbachstrasse + + + geradeaus weiter auf Zechenplatz + Zechenplatz + Zechenplatz + + + in Schlema geradeaus weiter auf Schneeberger Weg + Schneeberger Weg + Schneeberger Weg + + + links abbiegen auf Zechenplatz + Zechenplatz + Zechenplatz + + + rechts abbiegen auf Friedensstrasse + Friedensstrasse + Friedensstrasse + + + rechts abbiegen auf B169 Kobaltstrasse/Auer Strasse + B169 Kobaltstrasse/Auer Strasse + B169 Kobaltstrasse/Auer Strasse + + + in Schneeberg rechts abbiegen auf B169 Kobaltstrasse + B169 Kobaltstrasse + B169 Kobaltstrasse + + + in Hundshübel halb rechts halten auf B169 Hauptstrasse + B169 Hauptstrasse + B169 Hauptstrasse + + + in Stützengrün rechts abbiegen auf B169 Auerbacher Strasse + B169 Auerbacher Strasse + B169 Auerbacher Strasse + + + in Rodewisch rechts abbiegen auf B169 Postplatz + B169 Postplatz + B169 Postplatz + + + links abbiegen auf B169 Postplatz + B169 Postplatz + B169 Postplatz + + + bei D 08228 Rodewisch + B169\Lindenstrasse + B169\Lindenstrasse + + + bei D 08209 Auerbach + B169\Göltzschtalstrasse + B169\Göltzschtalstrasse + + + in Auerbach/Vogtl. links abbiegen auf B169 Göltzschtalstrasse + B169 Göltzschtalstrasse + B169 Göltzschtalstrasse + + + in Ellefeld links abbiegen auf Neuberg + Neuberg + Neuberg + + + rechts abbiegen auf Neuberg + Neuberg + Neuberg + + + rechts abbiegen auf Beerheider Strasse (K7833) + Beerheider Strasse (K7833) + Beerheider Strasse (K7833) + + + rechts abbiegen auf Beerheider Strasse (K7833) + Beerheider Strasse (K7833) + Beerheider Strasse (K7833) + + + bei D 08209 Auerbach/Beerheide + K7833\Rempesgrüner Strasse + K7833\Rempesgrüner Strasse + + + in Beerheide links abbiegen auf Strasse des Friedens (K7826) + Strasse des Friedens (K7826) + Strasse des Friedens (K7826) + + + in Hohengrün rechts abbiegen auf Klingenthaler Strasse (S300) + Klingenthaler Strasse (S300) + Klingenthaler Strasse (S300) + + + links abbiegen + + + links abbiegen auf Schallerbachstrasse (K7822) + Schallerbachstrasse (K7822) + Schallerbachstrasse (K7822) + + + in Brunn rechts abbiegen auf Schönheider Strasse (S278) + Schönheider Strasse (S278) + Schönheider Strasse (S278) + + + in Schönheide halb rechts halten auf Hauptstrasse (S278) + Hauptstrasse (S278) + Hauptstrasse (S278) + + + D 08304 Schönheide + S278\Hauptstrasse + S278\Hauptstrasse + + + halb links halten auf Hauptstrasse (S278) + Hauptstrasse (S278) + Hauptstrasse (S278) + + + geradeaus weiter auf Eibenstocker Strasse (S277) + Eibenstocker Strasse (S277) + Eibenstocker Strasse (S277) + + + rechts abbiegen auf B283 Muldenstrasse + B283 Muldenstrasse + B283 Muldenstrasse + + + halb rechts halten auf Am Filz + Am Filz + Am Filz + + + geradeaus weiter auf B283 Schönheider Strasse + B283 Schönheider Strasse + B283 Schönheider Strasse + + + bei D 08262 Tannenbergsthal/Jägersgrün + B283\Schönheider Strasse + B283\Schönheider Strasse + + + bei D 08262 Tannenbergsthal + B283\Klingenthaler Strasse + B283\Klingenthaler Strasse + + + in Klingenthal/Sa. links abbiegen auf B283 Auerbacher Strasse + B283 Auerbacher Strasse + B283 Auerbacher Strasse + + + rechts abbiegen auf Mittelbergstrasse + Mittelbergstrasse + Mittelbergstrasse + + + rechts abbiegen auf Falkensteiner Strasse (S304) + Falkensteiner Strasse (S304) + Falkensteiner Strasse (S304) + + + bei D 08248 Klingenthal/Brunndöbra + S304\Falkensteiner Strasse + S304\Falkensteiner Strasse + + + bei D 08223 Grünbach-Muldenberg + S302/S304 + S302/S304 + + + halb links halten auf S304 + S304 + S304 + + + bei D 08223 Grünbach + S304\Bahnhofstrasse + S304\Bahnhofstrasse + + + in Grünbach links abbiegen auf Neustädter Strasse (K7835) + Neustädter Strasse (K7835) + Neustädter Strasse (K7835) + + + links abbiegen auf Siehdichfürer Strasse (K7835) + Siehdichfürer Strasse (K7835) + Siehdichfürer Strasse (K7835) + + + in Neudorf links abbiegen auf Schönecker Strasse (S301) + Schönecker Strasse (S301) + Schönecker Strasse (S301) + + + links abbiegen auf Schönecker Strasse (S301) + Schönecker Strasse (S301) + Schönecker Strasse (S301) + + + bei D 08261 Schöneck + S301 + S301 + + + in Schöneck/Vogtl. rechts abbiegen auf Falkensteiner Strasse (S301/S302) + Falkensteiner Strasse (S301/S302) + Falkensteiner Strasse (S301/S302) + + + links abbiegen auf Albertplatz/Falkensteiner Strasse (S301/S302) + Albertplatz/Falkensteiner Strasse (S301/S302) + Albertplatz/Falkensteiner Strasse (S301/S302) + + + rechts abbiegen auf Klingenthaler Strasse (S301) + Klingenthaler Strasse (S301) + Klingenthaler Strasse (S301) + + + einfahren in Kreisverkehr + + + 2. Möglichkeit aus Kreisverkehr ausfahren auf Kärnerstrasse (S305) + Kärnerstrasse (S305) + Kärnerstrasse (S305) + + + rechts abbiegen auf B283 + B283 + B283 + + + bei D 08258 Markneukirchen/Friebus + B283 + B283 + + + rechts abbiegen auf B283 + B283 + B283 + + + in Siebenbrunn geradeaus weiter auf Am Bahnhof + Am Bahnhof + Am Bahnhof + + + links abbiegen auf Strässler Berg + Strässler Berg + Strässler Berg + + + geradeaus weiter auf Siebenbrunner Strasse + Siebenbrunner Strasse + Siebenbrunner Strasse + + + in Strässel links abbiegen auf Böhmische Strasse (K7846) + Böhmische Strasse (K7846) + Böhmische Strasse (K7846) + + + in Schönlind rechts abbiegen auf Markneukirchner Strasse (K7843) + Markneukirchner Strasse (K7843) + Markneukirchner Strasse (K7843) + + + links abbiegen auf Landwüster Strasse (K7846) + Landwüster Strasse (K7846) + Landwüster Strasse (K7846) + + + in Landwüst halb rechts halten auf Schönlinder Strasse (K7844) + Schönlinder Strasse (K7844) + Schönlinder Strasse (K7844) + + + rechts abbiegen auf Rauner Strasse (K7844) + Rauner Strasse (K7844) + Rauner Strasse (K7844) + + + bei D 08258 Landwüst + K7844\Rauner Strasse + K7844\Rauner Strasse + + + geradeaus weiter auf B92/E49 + B92/E49 + B92/E49 + + + bei D 08626 Adorf/Jugelsburg + B92/E49 + B92/E49 + + + bei D 08626 Adorf + B92/E49\Oelsnitzer Strasse + B92/E49\Oelsnitzer Strasse + + + halb links halten + + + geradeaus weiter auf B92/E49 Adorfer Strasse + B92/E49 Adorfer Strasse + B92/E49 Adorfer Strasse + + + halb links halten + + + rechts abbiegen + + + links abbiegen auf B92/E49 Adorfer Strasse + B92/E49 Adorfer Strasse + B92/E49 Adorfer Strasse + + + in Oelsnitz links abbiegen auf Rosa-Luxemburg-Strasse (S311) + Rosa-Luxemburg-Strasse (S311) + Rosa-Luxemburg-Strasse (S311) + + + links abbiegen auf Grabenstrasse (S311) + Grabenstrasse (S311) + Grabenstrasse (S311) + + + links abbiegen auf Kirchplatz (S311) + Kirchplatz (S311) + Kirchplatz (S311) + + + rechts abbiegen auf Heppeplatz (S311) + Heppeplatz (S311) + Heppeplatz (S311) + + + links abbiegen auf Bahnhofstrasse (S307) + Bahnhofstrasse (S307) + Bahnhofstrasse (S307) + + + rechts abbiegen auf Talsperrenstrasse (S310) + Talsperrenstrasse (S310) + Talsperrenstrasse (S310) + + + rechts abbiegen auf Talsperrenstrasse (K7854) + Talsperrenstrasse (K7854) + Talsperrenstrasse (K7854) + + + bei D 08606 Planschwitz + K7854\Oelsnitzer Strasse + K7854\Oelsnitzer Strasse + + + in Planschwitz links abbiegen auf Talsperrenstrasse (K7854) + Talsperrenstrasse (K7854) + Talsperrenstrasse (K7854) + + + links abbiegen + + + in Bösenbrunn rechts abbiegen auf S310 + S310 + S310 + + + links abbiegen auf S310 + S310 + S310 + + + in Dröda rechts abbiegen auf Hauptstrasse/Bobenneukirchener Strasse (S310) + Hauptstrasse/Bobenneukirchener Strasse (S310) + Hauptstrasse/Bobenneukirchener Strasse (S310) + + + halb rechts halten auf Bobenneukirchener Strasse (S310) + Bobenneukirchener Strasse (S310) + Bobenneukirchener Strasse (S310) + + + bei D 08538 Burgstein/Dröda + S310\Bobenneukirchener Strasse + S310\Bobenneukirchener Strasse + + + in Pirk rechts abbiegen auf B173 Hofer Strasse + B173 Hofer Strasse + B173 Hofer Strasse + + + links abbiegen auf Zur Pirkmühle (K7859) + Zur Pirkmühle (K7859) + Zur Pirkmühle (K7859) + + + bei D 08538 Burgstein/Pirk + K7859 + K7859 + + + in Geilsdorf links abbiegen auf Winkel (K7859) + Winkel (K7859) + Winkel (K7859) + + + in Schwand links abbiegen auf Weischlitzer Strasse (K7859) + Weischlitzer Strasse (K7859) + Weischlitzer Strasse (K7859) + + + halb rechts halten auf Weischlitzer Strasse (K7859) + Weischlitzer Strasse (K7859) + Weischlitzer Strasse (K7859) + + + bei D 08538 Burgstein/Kemnitz + K7859 + K7859 + + + links abbiegen auf Kemnitzer Strasse + Kemnitzer Strasse + Kemnitzer Strasse + + + in Krebes rechts abbiegen auf Burgsteinstrasse (K7860) + Burgsteinstrasse (K7860) + Burgsteinstrasse (K7860) + + + geradeaus weiter + + + links abbiegen + + + in Heinersgrün halb links halten auf An der Kapelle (K7855) + An der Kapelle (K7855) + An der Kapelle (K7855) + + + rechts abbiegen + + + geradeaus weiter auf B173 + B173 + B173 + + + bei D95032 Hof + + + diff --git a/reference/track/fugawi.txt b/reference/track/fugawi.txt new file mode 100644 index 000000000..8bca8dc50 --- /dev/null +++ b/reference/track/fugawi.txt @@ -0,0 +1,74 @@ +# Latitude, Longitude and UTM coordinates are in WGS84 datum +# +# Every set of data contains the following: +# +# Waypoint name +# Waypoint comment +# Waypoint description +# Latitude in Degree and decimals (soutern hemisphere has neg. degrees) +# Longitude in degree and decimals (neg. numbers: west of Greenwich) +# Height in meters [optional when importing, always present when exporting: Date (GMT) as ISO YYYYMMDD, Time of the day relative to the date as HHMMSS +RPT001,RPT001,,30.0621833,-91.6103500,1.0 ,20020525,170621 +RPT002,RPT002,,30.0627833,-91.6105667,0.0 ,20020525,170955 +RPT003,RPT003,,30.0627000,-91.6082667,0.0 ,20020525,171200 +RPT004,RPT004,,30.0623333,-91.6073833,0.0 ,20020525,171248 +RPT005,RPT005,,30.0615333,-91.6052833,0.0 ,20020525,171441 +RPT006,RPT006,,30.0597833,-91.5994000,0.0 ,20020525,171716 +RPT007,RPT007,,30.0578000,-91.5966833,0.0 ,20020525,171746 +RPT008,RPT008,,30.0553833,-91.5949000,0.0 ,20020525,171820 +RPT009,RPT009,,30.0538833,-91.5926167,0.0 ,20020525,171901 +RPT010,RPT010,,30.0497333,-91.5897500,0.0 ,20020525,172046 +RPT011,RPT011,,30.0490167,-91.5898833,0.0 ,20020525,172110 +RPT012,RPT012,,30.0488000,-91.5929333,0.0 ,20020525,172151 +RPT013,RPT013,,30.0462333,-91.5964500,0.0 ,20020525,172235 +RPT014,RPT014,,30.0455167,-91.5987167,0.0 ,20020525,172308 +RPT015,RPT015,,30.0473000,-91.6002667,0.0 ,20020525,180423 +RPT016,RPT016,,30.0470000,-91.5996333,2.0 ,20020525,180604 +RPT017,RPT017,,30.0464333,-91.5994667,0.0 ,20020525,180706 +RPT018,RPT018,,30.0462000,-91.5989500,1.0 ,20020525,180818 +RPT019,RPT019,,30.0463667,-91.5977333,0.0 ,20020525,181020 +RPT020,RPT020,,30.0463500,-91.5971667,0.0 ,20020525,181109 +RPT021,RPT021,,30.0467833,-91.5963333,0.0 ,20020525,181218 +RPT022,RPT022,,30.0474500,-91.5952000,0.0 ,20020525,181422 +RPT023,RPT023,,30.0478000,-91.5947667,2.0 ,20020525,181504 +RPT024,RPT024,,30.0482500,-91.5940833,1.0 ,20020525,181614 +RPT025,RPT025,,30.0486833,-91.5938000,1.0 ,20020525,181701 +RPT026,RPT026,,30.0493500,-91.5938500,0.0 ,20020525,181807 +RPT027,RPT027,,30.0503167,-91.5939833,2.0 ,20020525,181951 +RPT028,RPT028,,30.0507833,-91.5941167,0.0 ,20020525,182039 +RPT029,RPT029,,30.0512333,-91.5943667,0.0 ,20020525,182124 +RPT030,RPT030,,30.0518000,-91.5943667,0.0 ,20020525,182217 +RPT031,RPT031,,30.0522167,-91.5946667,0.0 ,20020525,182318 +RPT032,RPT032,,30.0530167,-91.5946833,0.0 ,20020525,182437 +RPT033,RPT033,,30.0548667,-91.5952000,6.0 ,20020525,182813 +RPT034,RPT034,,30.0537333,-91.5949333,2.0 ,20020525,183136 +RPT035,RPT035,,30.0531833,-91.5947833,0.0 ,20020525,183256 +RPT036,RPT036,,30.0526333,-91.5948333,0.0 ,20020525,183402 +RPT037,RPT037,,30.0524500,-91.5954333,0.0 ,20020525,183603 +RPT038,RPT038,,30.0524833,-91.5959667,0.0 ,20020525,183648 +RPT039,RPT039,,30.0526500,-91.5967833,1.0 ,20020525,183752 +RPT040,RPT040,,30.0531333,-91.5978500,0.0 ,20020525,183918 +RPT041,RPT041,,30.0536167,-91.5979667,0.0 ,20020525,184015 +RPT042,RPT042,,30.0539667,-91.5977667,6.0 ,20020525,184125 +RPT043,RPT043,,30.0536167,-91.5980833,0.0 ,20020525,184237 +RPT044,RPT044,,30.0532000,-91.5979167,0.0 ,20020525,184401 +RPT045,RPT045,,30.0528167,-91.5975167,0.0 ,20020525,184553 +RPT046,RPT046,,30.0525667,-91.5969333,0.0 ,20020525,184654 +RPT047,RPT047,,30.0523333,-91.5964333,0.0 ,20020525,184742 +RPT048,RPT048,,30.0522500,-91.5956833,0.0 ,20020525,184841 +RPT049,RPT049,,30.0522167,-91.5950167,0.0 ,20020525,184952 +RPT050,RPT050,,30.0518833,-91.5947000,0.0 ,20020525,185049 +RPT051,RPT051,,30.0510500,-91.5944000,0.0 ,20020525,185214 +RPT052,RPT052,,30.0505667,-91.5942333,0.0 ,20020525,185256 +RPT053,RPT053,,30.0501833,-91.5941000,0.0 ,20020525,185338 +RPT054,RPT054,,30.0491000,-91.5937167,0.0 ,20020525,185511 +RPT055,RPT055,,30.0484500,-91.5942500,0.0 ,20020525,185632 +RPT056,RPT056,,30.0480833,-91.5947500,0.0 ,20020525,185724 +RPT057,RPT057,,30.0475000,-91.5954500,7.0 ,20020525,185840 +RPT058,RPT058,,30.0470667,-91.5960000,0.0 ,20020525,185928 +RPT059,RPT059,,30.0466333,-91.5966000,0.0 ,20020525,190022 +RPT060,RPT060,,30.0464000,-91.5976500,0.0 ,20020525,190141 +RPT061,RPT061,,30.0462333,-91.5984667,0.0 ,20020525,190248 +RPT062,RPT062,,30.0463167,-91.5989667,0.0 ,20020525,190343 +RPT063,RPT063,,30.0467833,-91.5992833,0.0 ,20020525,190449 +RPT064,RPT064,,30.0471333,-91.5996667,0.0 ,20020525,190557 diff --git a/reference/track/garmin_logbook.xml b/reference/track/garmin_logbook.xml new file mode 100644 index 000000000..edab29b04 --- /dev/null +++ b/reference/track/garmin_logbook.xml @@ -0,0 +1,2047 @@ + + + + + + 2004-12-21T15:14:32Z + PT1259.400S + + 43.60257 + 3.85169 + + + 43.56778 + 3.83445 + + 6067.921 + 331 + + + 2004-12-21T15:35:31Z + PT3352.850S + + 43.56778 + 3.83445 + + 110755.828 + 793 + + + 2004-12-21T16:31:24Z + PT1680.720S + + 42.93887 + 2.97314 + + + 42.77292 + 2.98848 + + 28240.844 + 411 + + + + + 43.60261 + 3.85165 + 46.761 + + + + + + 43.60171 + 3.85249 + 41.955 + + + + + + 43.60115 + 3.85067 + 42.435 + + + + + + 43.60098 + 3.84931 + 41.955 + + + + + + 43.60017 + 3.84794 + 40.513 + + + + + + 43.59924 + 3.84674 + 40.032 + + + + + + 43.59665 + 3.84908 + 42.435 + + + + + + 43.59448 + 3.85026 + 45.319 + + + + + + 43.59289 + 3.85227 + 46.281 + + + + + + 43.59231 + 3.85257 + 45.800 + + + + + + 43.59308 + 3.85234 + 45.800 + + + + + + 43.59238 + 3.85292 + 44.358 + + + + + + 43.59055 + 3.85509 + 47.242 + + + + + + 43.58967 + 3.85592 + 45.800 + + + + + + 43.58948 + 3.85594 + 44.839 + + + + + + 43.58851 + 3.85500 + 44.839 + + + + + + 43.58736 + 3.85350 + 53.010 + + + + + + 43.58530 + 3.85142 + 50.607 + + + + + + 43.58416 + 3.84865 + 34.264 + + + + + + 43.58414 + 3.84794 + 28.977 + + + + + + 43.58394 + 3.84768 + 24.170 + + + + + + 43.58371 + 3.84762 + 26.093 + + + + + + 43.58321 + 3.84800 + 25.612 + + + + + + 43.58186 + 3.84794 + 27.535 + + + + + + 43.57394 + 3.84884 + 25.132 + + + + + + 43.57326 + 3.84882 + 25.132 + + + + + + 43.57382 + 3.84809 + 25.132 + + + + + + 43.57377 + 3.84792 + 25.612 + + + + + + 43.57317 + 3.84813 + 25.132 + + + + + + 43.57309 + 3.84841 + 29.458 + + + + + + 43.57264 + 3.84891 + 29.458 + + + + + + 43.57206 + 3.84891 + 28.016 + + + + + + 43.57152 + 3.84770 + 27.535 + + + + + + 43.57154 + 3.84734 + 25.612 + + + + + + 43.57163 + 3.84742 + 28.977 + + + + + + 43.57111 + 3.84642 + 21.767 + + + + + + 43.57034 + 3.84579 + 16.480 + + + + + + 43.56997 + 3.84519 + 16.480 + + + + + + 43.57049 + 3.84346 + 17.922 + + + + + + 43.56961 + 3.84262 + 19.844 + + + + + + 43.56942 + 3.84195 + 20.325 + + + + + + 43.56980 + 3.83914 + 26.093 + + + + + + 43.56997 + 3.83865 + 26.093 + + + + + + 43.57058 + 3.83865 + 26.093 + + + + + + 43.57032 + 3.83749 + 26.574 + + + + + + 43.56995 + 3.83715 + 28.977 + + + + + + 43.56927 + 3.83745 + 28.977 + + + + + + 43.56856 + 3.83524 + 23.209 + + + + + + 43.56830 + 3.83485 + 24.170 + + + + + + 43.56764 + 3.83434 + 30.900 + + + + + + 43.56704 + 3.83395 + 30.419 + + + + + + 43.56463 + 3.83384 + 31.861 + + + + + + 43.56418 + 3.83350 + 31.861 + + + + + + 43.56334 + 3.83107 + 32.822 + + + + + + 43.56216 + 3.82916 + 34.264 + + + + + + 43.55633 + 3.82350 + 26.093 + + + + + + 43.55476 + 3.82174 + 24.651 + + + + + + 43.55322 + 3.81912 + 21.286 + + + + + + 43.55251 + 3.81751 + 18.883 + + + + + + 43.55148 + 3.81410 + 19.364 + + + + + + 43.55075 + 3.80917 + 25.612 + + + + + + 43.55023 + 3.80236 + 28.496 + + + + + + 43.54946 + 3.79996 + 32.342 + + + + + + 43.54871 + 3.79827 + 35.706 + + + + + + 43.54633 + 3.79391 + 37.148 + + + + + + 43.54367 + 3.79082 + 37.148 + + + + + + 43.53822 + 3.78282 + 37.148 + + + + + + 43.53695 + 3.78153 + 37.148 + + + + + + 43.53453 + 3.77975 + 42.916 + + + + + + 43.53272 + 3.77747 + 42.916 + + + + + + 43.52672 + 3.76750 + 50.126 + + + + + + 43.52472 + 3.76380 + 50.607 + + + + + + 43.51985 + 3.75400 + 53.490 + + + + + + 43.51815 + 3.75114 + 59.258 + + + + + + 43.51556 + 3.74814 + 61.181 + + + + + + 43.50736 + 3.74052 + 61.181 + + + + + + 43.50474 + 3.73413 + 61.181 + + + + + + 43.50200 + 3.72932 + 66.949 + + + + + + 43.50067 + 3.72735 + 71.275 + + + + + + 43.49738 + 3.72321 + 72.717 + + + + + + 43.49090 + 3.71621 + 70.313 + + + + + + 43.48979 + 3.71441 + 65.988 + + + + + + 43.48841 + 3.71156 + 57.336 + + + + + + 43.48756 + 3.70950 + 50.607 + + + + + + 43.48689 + 3.70726 + 49.165 + + + + + + 43.48616 + 3.70400 + 48.203 + + + + + + 43.48475 + 3.69561 + 46.761 + + + + + + 43.48417 + 3.69325 + 47.242 + + + + + + 43.48080 + 3.68186 + 47.242 + + + + + + 43.47975 + 3.66527 + 48.203 + + + + + + 43.47944 + 3.66259 + 31.380 + + + + + + 43.47910 + 3.66038 + 35.225 + + + + + + 43.47839 + 3.65746 + 39.551 + + + + + + 43.47726 + 3.65413 + 43.877 + + + + + + 43.47537 + 3.64950 + 44.839 + + + + + + 43.47277 + 3.64463 + 49.645 + + + + + + 43.46530 + 3.63289 + 63.104 + + + + + + 43.46230 + 3.62718 + 63.104 + + + + + + 43.46181 + 3.62347 + 62.623 + + + + + + 43.46043 + 3.61755 + 53.010 + + + + + + 43.45876 + 3.61268 + 50.607 + + + + + + 43.45640 + 3.60789 + 49.165 + + + + + + 43.45451 + 3.60482 + 47.242 + + + + + + 43.45346 + 3.60264 + 40.032 + + + + + + 43.45209 + 3.59925 + 37.629 + + + + + + 43.45050 + 3.59412 + 37.629 + + + + + + 43.44996 + 3.58350 + 37.148 + + + + + + 43.44827 + 3.57886 + 34.745 + + + + + + 43.44672 + 3.57626 + 34.745 + + + + + + 43.44415 + 3.57403 + 33.303 + + + + + + 43.43353 + 3.56414 + 30.419 + + + + + + 43.43035 + 3.56191 + 22.248 + + + + + + 43.42372 + 3.54925 + 22.248 + + + + + + 43.42018 + 3.53071 + 31.861 + + + + + + 43.41915 + 3.52646 + 33.303 + + + + + + 43.40803 + 3.49606 + 33.303 + + + + + + 43.40181 + 3.47760 + 33.303 + + + + + + 43.39314 + 3.46365 + 18.883 + + + + + + 43.38902 + 3.45773 + 15.999 + + + + + + 43.38647 + 3.45436 + 15.518 + + + + + + 43.38198 + 3.44893 + 15.038 + + + + + + 43.38113 + 3.44769 + 15.038 + + + + + + 43.37317 + 3.40121 + 15.038 + + + + + + 43.36544 + 3.38523 + 14.557 + + + + + + 43.36435 + 3.38188 + 15.518 + + + + + + 43.36276 + 3.37540 + 23.209 + + + + + + 43.36209 + 3.36909 + 28.977 + + + + + + 43.36207 + 3.35684 + 46.281 + + + + + + 43.36177 + 3.35135 + 55.894 + + + + + + 43.36089 + 3.34677 + 53.971 + + + + + + 43.35902 + 3.34190 + 50.607 + + + + + + 43.35742 + 3.34025 + 43.877 + + + + + + 43.35430 + 3.33620 + 39.551 + + + + + + 43.34954 + 3.33085 + 36.667 + + + + + + 43.34819 + 3.32892 + 37.629 + + + + + + 43.34546 + 3.32437 + 38.109 + + + + + + 43.32637 + 3.27375 + 30.419 + + + + + + 43.31830 + 3.26253 + 15.038 + + + + + + 43.29984 + 3.20734 + 38.590 + + + + + + 43.29744 + 3.20161 + 46.281 + + + + + + 43.29433 + 3.19700 + 44.358 + + + + + + 43.29130 + 3.19318 + 44.358 + + + + + + 43.28092 + 3.18558 + 43.397 + + + + + + 43.26734 + 3.17717 + 44.358 + + + + + + 43.26380 + 3.17322 + 42.916 + + + + + + 43.26178 + 3.17056 + 43.397 + + + + + + 43.25622 + 3.16250 + 40.513 + + + + + + 43.25266 + 3.15799 + 40.513 + + + + + + 43.25171 + 3.15696 + 40.032 + + + + + + 43.24925 + 3.15496 + 34.745 + + + + + + 43.24002 + 3.14497 + 23.209 + + + + + + 43.23712 + 3.14123 + 23.690 + + + + + + 43.23169 + 3.13205 + 22.728 + + + + + + 43.22685 + 3.10171 + 21.286 + + + + + + 43.22324 + 3.09548 + 70.313 + + + + + + 43.22127 + 3.09441 + 49.165 + + + + + + 43.19736 + 3.07525 + 47.723 + + + + + + 43.19301 + 3.07016 + 45.319 + + + + + + 43.18998 + 3.06609 + 40.993 + + + + + + 43.18571 + 3.05911 + 41.474 + + + + + + 43.18509 + 3.05551 + 18.402 + + + + + + 43.18056 + 3.04332 + 4.463 + + + + + + 43.16492 + 2.99695 + 4.463 + + + + + + 43.16271 + 2.99287 + 6.386 + + + + + + 43.16204 + 2.99195 + 7.347 + + + + + + 43.15953 + 2.98867 + 7.347 + + + + + + 43.14003 + 2.97736 + 7.347 + + + + + + 43.13777 + 2.97526 + -2.266 + + + + + + 43.12911 + 2.96367 + 34.264 + + + + + + 43.12608 + 2.96036 + 40.032 + + + + + + 43.12299 + 2.95863 + 40.513 + + + + + + 43.11838 + 2.95702 + 40.513 + + + + + + 43.11505 + 2.95444 + 39.551 + + + + + + 43.11168 + 2.95152 + 39.551 + + + + + + 43.10997 + 2.95062 + 38.109 + + + + + + 43.10602 + 2.94745 + 38.109 + + + + + + 43.10276 + 2.94414 + 38.109 + + + + + + 43.09990 + 2.94161 + 38.109 + + + + + + 43.08029 + 2.93590 + 28.977 + + + + + + 43.06995 + 2.93676 + 35.706 + + + + + + 43.06196 + 2.93560 + 36.187 + + + + + + 43.06102 + 2.93595 + 36.667 + + + + + + 43.04527 + 2.94380 + 20.806 + + + + + + 43.00096 + 2.96461 + 40.993 + + + + + + 42.99924 + 2.96599 + 38.590 + + + + + + 42.97712 + 2.97403 + 41.474 + + + + + + 42.97555 + 2.97328 + 41.474 + + + + + + 42.97186 + 2.97062 + 40.993 + + + + + + 42.96901 + 2.96903 + 40.032 + + + + + + 42.96622 + 2.96794 + 39.551 + + + + + + 42.96234 + 2.96676 + 39.551 + + + + + + 42.95998 + 2.96923 + 39.551 + + + + + + 42.95626 + 2.97000 + 39.551 + + + + + + 42.94131 + 2.96985 + 44.358 + + + + + + 42.93809 + 2.96609 + 57.817 + + + + + + 42.93875 + 2.97498 + 30.419 + + + + + + 42.93828 + 2.98187 + 30.900 + + + + + + 42.93794 + 2.98414 + 29.458 + + + + + + 42.93612 + 2.99272 + 22.728 + + + + + + 42.93455 + 2.99957 + 15.038 + + + + + + 42.92891 + 3.02045 + 14.076 + + + + + + 42.92472 + 3.01991 + 14.076 + + + + + + 42.92150 + 3.01712 + 15.999 + + + + + + 42.91897 + 3.01749 + 15.999 + + + + + + 42.91798 + 3.02042 + 17.922 + + + + + + 42.91545 + 3.02259 + 17.922 + + + + + + 42.90590 + 3.04057 + 13.596 + + + + + + 42.90530 + 3.04529 + 11.673 + + + + + + 42.90135 + 3.05411 + 10.231 + + + + + + 42.88610 + 3.04768 + 11.673 + + + + + + 42.87893 + 3.04165 + 3.021 + + + + + + 42.86676 + 3.03083 + 3.021 + + + + + + 42.86548 + 3.03012 + 1.099 + + + + + + 42.86294 + 3.02922 + 0.137 + + + + + + 42.86058 + 3.02935 + 3.983 + + + + + + 42.85408 + 3.03195 + 4.944 + + + + + + 42.85337 + 3.03429 + 7.347 + + + + + + 42.84526 + 3.03972 + 8.789 + + + + + + 42.84239 + 3.04023 + 8.789 + + + + + + 42.83900 + 3.03999 + 8.789 + + + + + + 42.83741 + 3.03879 + 8.789 + + + + + + 42.82801 + 3.03439 + 8.789 + + + + + + 42.81561 + 3.02817 + 8.789 + + + + + + 42.81005 + 3.03096 + 8.789 + + + + + + 42.80838 + 3.03109 + 8.789 + + + + + + 42.78855 + 3.02161 + 8.309 + + + + + + 42.78771 + 3.01961 + 1.579 + + + + + + 42.78821 + 3.01688 + 0.618 + + + + + + 42.78821 + 3.01609 + 1.099 + + + + + + 42.78786 + 3.01482 + 1.579 + + + + + + 42.78728 + 3.01467 + 3.021 + + + + + + 42.78664 + 3.01431 + 3.502 + + + + + + 42.78520 + 3.01422 + 3.983 + + + + + + 42.78398 + 3.01440 + 2.541 + + + + + + 42.77808 + 3.01573 + 6.386 + + + + + + 42.77439 + 3.01639 + 6.386 + + + + + + 42.77390 + 3.01313 + 2.541 + + + + + + 42.77329 + 3.01070 + 2.541 + + + + + + 42.77329 + 3.00997 + 3.021 + + + + + + 42.77235 + 3.00796 + 4.463 + + + + + + 42.77207 + 3.00540 + 6.866 + + + + + + 42.77226 + 3.00371 + 8.309 + + + + + + 42.77413 + 2.99418 + 3.983 + + + + + + 42.77450 + 2.99109 + 3.502 + + + + + + 42.77302 + 2.98779 + 1.099 + + + + + + 42.77239 + 2.98753 + 2.060 + + + + + + 42.77244 + 2.98781 + 2.060 + + + + + + 42.77256 + 2.98809 + 3.502 + + + + + + 42.77347 + 2.98852 + 3.983 + + + + + + 42.77312 + 2.98854 + -1.785 + + + + + + + diff --git a/reference/track/i65.anr.gpx b/reference/track/i65.anr.gpx index d0a4f7973..041709c92 100644 --- a/reference/track/i65.anr.gpx +++ b/reference/track/i65.anr.gpx @@ -8,4963 +8,4963 @@ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/ - + \00000 - + \00001 - + \00002 - + \00003 - + \00004 - + \00005 - + \00006 - + \00007 - + \00008 - + \00009 - + \0000a - + \0000b - + \0000c - + \0000d - + \0000e - + \0000f - + \00010 - + \00011 - + \00012 - + \00013 - + \00014 - + \00015 - + \00016 - + \00017 - + \00018 - + \00019 - + \0001a - + \0001b - + \0001c - + \0001d - + \0001e - + \0001f - + \00020 - + \00021 - + \00022 - + \00023 - + \00024 - + \00025 - + \00026 - + \00027 - + \00028 - + \00029 - + \0002a - + \0002b - + \0002c - + \0002d - + \0002e - + \0002f - + \00030 - + \00031 - + \00032 - + \00033 - + \00034 - + \00035 - + \00036 - + \00037 - + \00038 - + \00039 - + \0003a - + \0003b - + \0003c - + \0003d - + \0003e - + \0003f - + \00040 - + \00041 - + \00042 - + \00043 - + \00044 - + \00045 - + \00046 - + \00047 - + \00048 - + \00049 - + \0004a - + \0004b - + \0004c - + \0004d - + \0004e - + \0004f - + \00050 - + \00051 - + \00052 - + \00053 - + \00054 - + \00055 - + \00056 - + \00057 - + \00058 - + \00059 - + \0005a - + \0005b - + \0005c - + \0005d - + \0005e - + \0005f - + \00060 - + \00061 - + \00062 - + \00063 - + \00064 - + \00065 - + \00066 - + \00067 - + \00068 - + \00069 - + \0006a - + \0006b - + \0006c - + \0006d - + \0006e - + \0006f - + \00070 - + \00071 - + \00072 - + \00073 - + \00074 - + \00075 - + \00076 - + \00077 - + \00078 - + \00079 - + \0007a - + \0007b - + \0007c - + \0007d - + \0007e - + \0007f - + \00080 - + \00081 - + \00082 - + \00083 - + \00084 - + \00085 - + \00086 - + \00087 - + \00088 - + \00089 - + \0008a - + \0008b - + \0008c - + \0008d - + \0008e - + \0008f - + \00090 - + \00091 - + \00092 - + \00093 - + \00094 - + \00095 - + \00096 - + \00097 - + \00098 - + \00099 - + \0009a - + \0009b - + \0009c - + \0009d - + \0009e - + \0009f - + \000a0 - + \000a1 - + \000a2 - + \000a3 - + \000a4 - + \000a5 - + \000a6 - + \000a7 - + \000a8 - + \000a9 - + \000aa - + \000ab - + \000ac - + \000ad - + \000ae - + \000af - + \000b0 - + \000b1 - + \000b2 - + \000b3 - + \000b4 - + \000b5 - + \000b6 - + \000b7 - + \000b8 - + \000b9 - + \000ba - + \000bb - + \000bc - + \000bd - + \000be - + \000bf - + \000c0 - + \000c1 - + \000c2 - + \000c3 - + \000c4 - + \000c5 - + \000c6 - + \000c7 - + \000c8 - + \000c9 - + \000ca - + \000cb - + \000cc - + \000cd - + \000ce - + \000cf - + \000d0 - + \000d1 - + \000d2 - + \000d3 - + \000d4 - + \000d5 - + \000d6 - + \000d7 - + \000d8 - + \000d9 - + \000da - + \000db - + \000dc - + \000dd - + \000de - + \000df - + \000e0 - + \000e1 - + \000e2 - + \000e3 - + \000e4 - + \000e5 - + \000e6 - + \000e7 - + \000e8 - + \000e9 - + \000ea - + \000eb - + \000ec - + \000ed - + \000ee - + \000ef - + \000f0 - + \000f1 - + \000f2 - + \000f3 - + \000f4 - + \000f5 - + \000f6 - + \000f7 - + \000f8 - + \000f9 - + \000fa - + \000fb - + \000fc - + \000fd - + \000fe - + \000ff - + \00100 - + \00101 - + \00102 - + \00103 - + \00104 - + \00105 - + \00106 - + \00107 - + \00108 - + \00109 - + \0010a - + \0010b - + \0010c - + \0010d - + \0010e - + \0010f - + \00110 - + \00111 - + \00112 - + \00113 - + \00114 - + \00115 - + \00116 - + \00117 - + \00118 - + \00119 - + \0011a - + \0011b - + \0011c - + \0011d - + \0011e - + \0011f - + \00120 - + \00121 - + \00122 - + \00123 - + \00124 - + \00125 - + \00126 - + \00127 - + \00128 - + \00129 - + \0012a - + \0012b - + \0012c - + \0012d - + \0012e - + \0012f - + \00130 - + \00131 - + \00132 - + \00133 - + \00134 - + \00135 - + \00136 - + \00137 - + \00138 - + \00139 - + \0013a - + \0013b - + \0013c - + \0013d - + \0013e - + \0013f - + \00140 - + \00141 - + \00142 - + \00143 - + \00144 - + \00145 - + \00146 - + \00147 - + \00148 - + \00149 - + \0014a - + \0014b - + \0014c - + \0014d - + \0014e - + \0014f - + \00150 - + \00151 - + \00152 - + \00153 - + \00154 - + \00155 - + \00156 - + \00157 - + \00158 - + \00159 - + \0015a - + \0015b - + \0015c - + \0015d - + \0015e - + \0015f - + \00160 - + \00161 - + \00162 - + \00163 - + \00164 - + \00165 - + \00166 - + \00167 - + \00168 - + \00169 - + \0016a - + \0016b - + \0016c - + \0016d - + \0016e - + \0016f - + \00170 - + \00171 - + \00172 - + \00173 - + \00174 - + \00175 - + \00176 - + \00177 - + \00178 - + \00179 - + \0017a - + \0017b - + \0017c - + \0017d - + \0017e - + \0017f - + \00180 - + \00181 - + \00182 - + \00183 - + \00184 - + \00185 - + \00186 - + \00187 - + \00188 - + \00189 - + \0018a - + \0018b - + \0018c - + \0018d - + \0018e - + \0018f - + \00190 - + \00191 - + \00192 - + \00193 - + \00194 - + \00195 - + \00196 - + \00197 - + \00198 - + \00199 - + \0019a - + \0019b - + \0019c - + \0019d - + \0019e - + \0019f - + \001a0 - + \001a1 - + \001a2 - + \001a3 - + \001a4 - + \001a5 - + \001a6 - + \001a7 - + \001a8 - + \001a9 - + \001aa - + \001ab - + \001ac - + \001ad - + \001ae - + \001af - + \001b0 - + \001b1 - + \001b2 - + \001b3 - + \001b4 - + \001b5 - + \001b6 - + \001b7 - + \001b8 - + \001b9 - + \001ba - + \001bb - + \001bc - + \001bd - + \001be - + \001bf - + \001c0 - + \001c1 - + \001c2 - + \001c3 - + \001c4 - + \001c5 - + \001c6 - + \001c7 - + \001c8 - + \001c9 - + \001ca - + \001cb - + \001cc - + \001cd - + \001ce - + \001cf - + \001d0 - + \001d1 - + \001d2 - + \001d3 - + \001d4 - + \001d5 - + \001d6 - + \001d7 - + \001d8 - + \001d9 - + \001da - + \001db - + \001dc - + \001dd - + \001de - + \001df - + \001e0 - + \001e1 - + \001e2 - + \001e3 - + \001e4 - + \001e5 - + \001e6 - + \001e7 - + \001e8 - + \001e9 - + \001ea - + \001eb - + \001ec - + \001ed - + \001ee - + \001ef - + \001f0 - + \001f1 - + \001f2 - + \001f3 - + \001f4 - + \001f5 - + \001f6 - + \001f7 - + \001f8 - + \001f9 - + \001fa - + \001fb - + \001fc - + \001fd - + \001fe - + \001ff - + \00200 - + \00201 - + \00202 - + \00203 - + \00204 - + \00205 - + \00206 - + \00207 - + \00208 - + \00209 - + \0020a - + \0020b - + \0020c - + \0020d - + \0020e - + \0020f - + \00210 - + \00211 - + \00212 - + \00213 - + \00214 - + \00215 - + \00216 - + \00217 - + \00218 - + \00219 - + \0021a - + \0021b - + \0021c - + \0021d - + \0021e - + \0021f - + \00220 - + \00221 - + \00222 - + \00223 - + \00224 - + \00225 - + \00226 - + \00227 - + \00228 - + \00229 - + \0022a - + \0022b - + \0022c - + \0022d - + \0022e - + \0022f - + \00230 - + \00231 - + \00232 - + \00233 - + \00234 - + \00235 - + \00236 - + \00237 - + \00238 - + \00239 - + \0023a - + \0023b - + \0023c - + \0023d - + \0023e - + \0023f - + \00240 - + \00241 - + \00242 - + \00243 - + \00244 - + \00245 - + \00246 - + \00247 - + \00248 - + \00249 - + \0024a - + \0024b - + \0024c - + \0024d - + \0024e - + \0024f - + \00250 - + \00251 - + \00252 - + \00253 - + \00254 - + \00255 - + \00256 - + \00257 - + \00258 - + \00259 - + \0025a - + \0025b - + \0025c - + \0025d - + \0025e - + \0025f - + \00260 - + \00261 - + \00262 - + \00263 - + \00264 - + \00265 - + \00266 - + \00267 - + \00268 - + \00269 - + \0026a - + \0026b - + \0026c - + \0026d - + \0026e - + \0026f - + \00270 - + \00271 - + \00272 - + \00273 - + \00274 - + \00275 - + \00276 - + \00277 - + \00278 - + \00279 - + \0027a - + \0027b - + \0027c - + \0027d - + \0027e - + \0027f - + \00280 - + \00281 - + \00282 - + \00283 - + \00284 - + \00285 - + \00286 - + \00287 - + \00288 - + \00289 - + \0028a - + \0028b - + \0028c - + \0028d - + \0028e - + \0028f - + \00290 - + \00291 - + \00292 - + \00293 - + \00294 - + \00295 - + \00296 - + \00297 - + \00298 - + \00299 - + \0029a - + \0029b - + \0029c - + \0029d - + \0029e - + \0029f - + \002a0 - + \002a1 - + \002a2 - + \002a3 - + \002a4 - + \002a5 - + \002a6 - + \002a7 - + \002a8 - + \002a9 - + \002aa - + \002ab - + \002ac - + \002ad - + \002ae - + \002af - + \002b0 - + \002b1 - + \002b2 - + \002b3 - + \002b4 - + \002b5 - + \002b6 - + \002b7 - + \002b8 - + \002b9 - + \002ba - + \002bb - + \002bc - + \002bd - + \002be - + \002bf - + \002c0 - + \002c1 - + \002c2 - + \002c3 - + \002c4 - + \002c5 - + \002c6 - + \002c7 - + \002c8 - + \002c9 - + \002ca - + \002cb - + \002cc - + \002cd - + \002ce - + \002cf - + \002d0 - + \002d1 - + \002d2 - + \002d3 - + \002d4 - + \002d5 - + \002d6 - + \002d7 - + \002d8 - + \002d9 - + \002da - + \002db - + \002dc - + \002dd - + \002de - + \002df - + \002e0 - + \002e1 - + \002e2 - + \002e3 - + \002e4 - + \002e5 - + \002e6 - + \002e7 - + \002e8 - + \002e9 - + \002ea - + \002eb - + \002ec - + \002ed - + \002ee - + \002ef - + \002f0 - + \002f1 - + \002f2 - + \002f3 - + \002f4 - + \002f5 - + \002f6 - + \002f7 - + \002f8 - + \002f9 - + \002fa - + \002fb - + \002fc - + \002fd - + \002fe - + \002ff - + \00300 - + \00301 - + \00302 - + \00303 - + \00304 - + \00305 - + \00306 - + \00307 - + \00308 - + \00309 - + \0030a - + \0030b - + \0030c - + \0030d - + \0030e - + \0030f - + \00310 - + \00311 - + \00312 - + \00313 - + \00314 - + \00315 - + \00316 - + \00317 - + \00318 - + \00319 - + \0031a - + \0031b - + \0031c - + \0031d - + \0031e - + \0031f - + \00320 - + \00321 - + \00322 - + \00323 - + \00324 - + \00325 - + \00326 - + \00327 - + \00328 - + \00329 - + \0032a - + \0032b - + \0032c - + \0032d - + \0032e - + \0032f - + \00330 - + \00331 - + \00332 - + \00333 - + \00334 - + \00335 - + \00336 - + \00337 - + \00338 - + \00339 - + \0033a - + \0033b - + \0033c - + \0033d - + \0033e - + \0033f - + \00340 - + \00341 - + \00342 - + \00343 - + \00344 - + \00345 - + \00346 - + \00347 - + \00348 - + \00349 - + \0034a - + \0034b - + \0034c - + \0034d - + \0034e - + \0034f - + \00350 - + \00351 - + \00352 - + \00353 - + \00354 - + \00355 - + \00356 - + \00357 - + \00358 - + \00359 - + \0035a - + \0035b - + \0035c - + \0035d - + \0035e - + \0035f - + \00360 - + \00361 - + \00362 - + \00363 - + \00364 - + \00365 - + \00366 - + \00367 - + \00368 - + \00369 - + \0036a - + \0036b - + \0036c - + \0036d - + \0036e - + \0036f - + \00370 - + \00371 - + \00372 - + \00373 - + \00374 - + \00375 - + \00376 - + \00377 - + \00378 - + \00379 - + \0037a - + \0037b - + \0037c - + \0037d - + \0037e - + \0037f - + \00380 - + \00381 - + \00382 - + \00383 - + \00384 - + \00385 - + \00386 - + \00387 - + \00388 - + \00389 - + \0038a - + \0038b - + \0038c - + \0038d - + \0038e - + \0038f - + \00390 - + \00391 - + \00392 - + \00393 - + \00394 - + \00395 - + \00396 - + \00397 - + \00398 - + \00399 - + \0039a - + \0039b - + \0039c - + \0039d - + \0039e - + \0039f - + \003a0 - + \003a1 - + \003a2 - + \003a3 - + \003a4 - + \003a5 - + \003a6 - + \003a7 - + \003a8 - + \003a9 - + \003aa - + \003ab - + \003ac - + \003ad - + \003ae - + \003af - + \003b0 - + \003b1 - + \003b2 - + \003b3 - + \003b4 - + \003b5 - + \003b6 - + \003b7 - + \003b8 - + \003b9 - + \003ba - + \003bb - + \003bc - + \003bd - + \003be - + \003bf - + \003c0 - + \003c1 - + \003c2 - + \003c3 - + \003c4 - + \003c5 - + \003c6 - + \003c7 - + \003c8 - + \003c9 - + \003ca - + \003cb - + \003cc - + \003cd - + \003ce - + \003cf - + \003d0 - + \003d1 - + \003d2 - + \003d3 - + \003d4 - + \003d5 - + \003d6 - + \003d7 - + \003d8 - + \003d9 - + \003da - + \003db - + \003dc - + \003dd - + \003de - + \003df - + \003e0 - + \003e1 - + \003e2 - + \003e3 - + \003e4 - + \003e5 - + \003e6 - + \003e7 - + \003e8 - + \003e9 - + \003ea - + \003eb - + \003ec - + \003ed - + \003ee - + \003ef - + \003f0 - + \003f1 - + \003f2 - + \003f3 - + \003f4 - + \003f5 - + \003f6 - + \003f7 - + \003f8 - + \003f9 - + \003fa - + \003fb - + \003fc - + \003fd - + \003fe - + \003ff - + \00400 - + \00401 - + \00402 - + \00403 - + \00404 - + \00405 - + \00406 - + \00407 - + \00408 - + \00409 - + \0040a - + \0040b - + \0040c - + \0040d - + \0040e - + \0040f - + \00410 - + \00411 - + \00412 - + \00413 - + \00414 - + \00415 - + \00416 - + \00417 - + \00418 - + \00419 - + \0041a - + \0041b - + \0041c - + \0041d - + \0041e - + \0041f - + \00420 - + \00421 - + \00422 - + \00423 - + \00424 - + \00425 - + \00426 - + \00427 - + \00428 - + \00429 - + \0042a - + \0042b - + \0042c - + \0042d - + \0042e - + \0042f - + \00430 - + \00431 - + \00432 - + \00433 - + \00434 - + \00435 - + \00436 - + \00437 - + \00438 - + \00439 - + \0043a - + \0043b - + \0043c - + \0043d - + \0043e - + \0043f - + \00440 - + \00441 - + \00442 - + \00443 - + \00444 - + \00445 - + \00446 - + \00447 - + \00448 - + \00449 - + \0044a - + \0044b - + \0044c - + \0044d - + \0044e - + \0044f - + \00450 - + \00451 - + \00452 - + \00453 - + \00454 - + \00455 - + \00456 - + \00457 - + \00458 - + \00459 - + \0045a - + \0045b - + \0045c - + \0045d - + \0045e - + \0045f - + \00460 - + \00461 - + \00462 - + \00463 - + \00464 - + \00465 - + \00466 - + \00467 - + \00468 - + \00469 - + \0046a - + \0046b - + \0046c - + \0046d - + \0046e - + \0046f - + \00470 - + \00471 - + \00472 - + \00473 - + \00474 - + \00475 - + \00476 - + \00477 - + \00478 - + \00479 - + \0047a - + \0047b - + \0047c - + \0047d - + \0047e - + \0047f - + \00480 - + \00481 - + \00482 - + \00483 - + \00484 - + \00485 - + \00486 - + \00487 - + \00488 - + \00489 - + \0048a - + \0048b - + \0048c - + \0048d - + \0048e - + \0048f - + \00490 - + \00491 - + \00492 - + \00493 - + \00494 - + \00495 - + \00496 - + \00497 - + \00498 - + \00499 - + \0049a - + \0049b - + \0049c - + \0049d - + \0049e - + \0049f - + \004a0 - + \004a1 - + \004a2 - + \004a3 - + \004a4 - + \004a5 - + \004a6 - + \004a7 - + \004a8 - + \004a9 - + \004aa - + \004ab - + \004ac - + \004ad - + \004ae - + \004af - + \004b0 - + \004b1 - + \004b2 - + \004b3 - + \004b4 - + \004b5 - + \004b6 - + \004b7 - + \004b8 - + \004b9 - + \004ba - + \004bb - + \004bc - + \004bd - + \004be - + \004bf - + \004c0 - + \004c1 - + \004c2 - + \004c3 - + \004c4 - + \004c5 - + \004c6 - + \004c7 - + \004c8 - + \004c9 - + \004ca - + \004cb - + \004cc - + \004cd - + \004ce - + \004cf - + \004d0 - + \004d1 - + \004d2 - + \004d3 - + \004d4 - + \004d5 - + \004d6 - + \004d7 - + \004d8 - + \004d9 - + \004da - + \004db - + \004dc - + \004dd - + \004de - + \004df - + \004e0 - + \004e1 - + \004e2 - + \004e3 - + \004e4 - + \004e5 - + \004e6 - + \004e7 - + \004e8 - + \004e9 - + \004ea - + \004eb - + \004ec - + \004ed - + \004ee - + \004ef - + \004f0 - + \004f1 - + \004f2 - + \004f3 - + \004f4 - + \004f5 - + \004f6 - + \004f7 - + \004f8 - + \004f9 - + \004fa - + \004fb - + \004fc - + \004fd - + \004fe - + \004ff - + \00500 - + \00501 - + \00502 - + \00503 - + \00504 - + \00505 - + \00506 - + \00507 - + \00508 - + \00509 - + \0050a - + \0050b - + \0050c - + \0050d - + \0050e - + \0050f - + \00510 - + \00511 - + \00512 - + \00513 - + \00514 - + \00515 - + \00516 - + \00517 - + \00518 - + \00519 - + \0051a - + \0051b - + \0051c - + \0051d - + \0051e - + \0051f - + \00520 - + \00521 - + \00522 - + \00523 - + \00524 - + \00525 - + \00526 - + \00527 - + \00528 - + \00529 - + \0052a - + \0052b - + \0052c - + \0052d - + \0052e - + \0052f - + \00530 - + \00531 - + \00532 - + \00533 - + \00534 - + \00535 - + \00536 - + \00537 - + \00538 - + \00539 - + \0053a - + \0053b - + \0053c - + \0053d - + \0053e - + \0053f - + \00540 - + \00541 - + \00542 - + \00543 - + \00544 - + \00545 - + \00546 - + \00547 - + \00548 - + \00549 - + \0054a - + \0054b - + \0054c - + \0054d - + \0054e - + \0054f - + \00550 - + \00551 - + \00552 - + \00553 - + \00554 - + \00555 - + \00556 - + \00557 - + \00558 - + \00559 - + \0055a - + \0055b - + \0055c - + \0055d - + \0055e - + \0055f - + \00560 - + \00561 - + \00562 - + \00563 - + \00564 - + \00565 - + \00566 - + \00567 - + \00568 - + \00569 - + \0056a - + \0056b - + \0056c - + \0056d - + \0056e - + \0056f - + \00570 - + \00571 - + \00572 - + \00573 - + \00574 - + \00575 - + \00576 - + \00577 - + \00578 - + \00579 - + \0057a - + \0057b - + \0057c - + \0057d - + \0057e - + \0057f - + \00580 - + \00581 - + \00582 - + \00583 - + \00584 - + \00585 - + \00586 - + \00587 - + \00588 - + \00589 - + \0058a - + \0058b - + \0058c - + \0058d - + \0058e - + \0058f - + \00590 - + \00591 - + \00592 - + \00593 - + \00594 - + \00595 - + \00596 - + \00597 - + \00598 - + \00599 - + \0059a - + \0059b - + \0059c - + \0059d - + \0059e - + \0059f - + \005a0 - + \005a1 - + \005a2 - + \005a3 - + \005a4 - + \005a5 - + \005a6 - + \005a7 - + \005a8 - + \005a9 - + \005aa - + \005ab - + \005ac - + \005ad - + \005ae - + \005af - + \005b0 - + \005b1 - + \005b2 - + \005b3 - + \005b4 - + \005b5 - + \005b6 - + \005b7 - + \005b8 - + \005b9 - + \005ba - + \005bb - + \005bc - + \005bd - + \005be - + \005bf - + \005c0 - + \005c1 - + \005c2 - + \005c3 - + \005c4 - + \005c5 - + \005c6 - + \005c7 - + \005c8 - + \005c9 - + \005ca - + \005cb - + \005cc - + \005cd - + \005ce - + \005cf - + \005d0 - + \005d1 - + \005d2 - + \005d3 - + \005d4 - + \005d5 - + \005d6 - + \005d7 - + \005d8 - + \005d9 - + \005da - + \005db - + \005dc - + \005dd - + \005de - + \005df - + \005e0 - + \005e1 - + \005e2 - + \005e3 - + \005e4 - + \005e5 - + \005e6 - + \005e7 - + \005e8 - + \005e9 - + \005ea - + \005eb - + \005ec - + \005ed - + \005ee - + \005ef - + \005f0 - + \005f1 - + \005f2 - + \005f3 - + \005f4 - + \005f5 - + \005f6 - + \005f7 - + \005f8 - + \005f9 - + \005fa - + \005fb - + \005fc - + \005fd - + \005fe - + \005ff - + \00600 - + \00601 - + \00602 - + \00603 - + \00604 - + \00605 - + \00606 - + \00607 - + \00608 - + \00609 - + \0060a - + \0060b - + \0060c - + \0060d - + \0060e - + \0060f - + \00610 - + \00611 - + \00612 - + \00613 - + \00614 - + \00615 - + \00616 - + \00617 - + \00618 - + \00619 - + \0061a - + \0061b - + \0061c - + \0061d - + \0061e - + \0061f - + \00620 - + \00621 - + \00622 - + \00623 - + \00624 - + \00625 - + \00626 - + \00627 - + \00628 - + \00629 - + \0062a - + \0062b - + \0062c - + \0062d - + \0062e - + \0062f - + \00630 - + \00631 - + \00632 - + \00633 - + \00634 - + \00635 - + \00636 - + \00637 - + \00638 - + \00639 - + \0063a - + \0063b - + \0063c - + \0063d - + \0063e - + \0063f - + \00640 - + \00641 - + \00642 - + \00643 - + \00644 - + \00645 - + \00646 - + \00647 - + \00648 - + \00649 - + \0064a - + \0064b - + \0064c - + \0064d - + \0064e - + \0064f - + \00650 - + \00651 - + \00652 - + \00653 - + \00654 - + \00655 - + \00656 - + \00657 - + \00658 - + \00659 - + \0065a - + \0065b - + \0065c - + \0065d - + \0065e - + \0065f - + \00660 - + \00661 - + \00662 - + \00663 - + \00664 - + \00665 - + \00666 - + \00667 - + \00668 - + \00669 - + \0066a - + \0066b - + \0066c - + \0066d - + \0066e - + \0066f - + \00670 - + \00671 - + \00672 - + \00673 - + \00674 diff --git a/reference/track/pathaway.gpx b/reference/track/pathaway.gpx new file mode 100644 index 000000000..72552ca80 --- /dev/null +++ b/reference/track/pathaway.gpx @@ -0,0 +1,1998 @@ + + + + + 20050116_Fahrradtour Gerd + + + 344.774223 + + + + 344.774223 + + + + 344.774223 + + + + 344.774223 + + + + 345.735538 + + + + 345.735538 + + + + 371.210825 + + + + 374.094649 + + + + 379.382067 + + + + 381.304698 + + + + 381.785294 + + + + 381.785294 + + + + 382.746732 + + + + 384.669485 + + + + 385.630678 + + + + 386.111397 + + + + 386.592116 + + + + 386.111397 + + + + 384.188766 + + + + 377.459436 + + + + 375.056086 + + + + 375.056086 + + + + 375.056086 + + + + 375.056086 + + + + 373.133455 + + + + 372.172018 + + + + 368.807475 + + + + 362.078145 + + + + 360.636111 + + + + 357.271446 + + + + 355.348815 + + + + 354.387499 + + + + 351.503431 + + + + 349.580800 + + + + 346.696854 + + + + 346.216257 + + + + 343.812786 + + + + 338.044893 + + + + 337.083577 + + + + 336.122262 + + + + 336.122262 + + + + 337.564174 + + + + 334.680228 + + + + 338.044893 + + + + 337.564174 + + + + 337.564174 + + + + 338.525612 + + + + 339.486805 + + + + 347.177451 + + + + 347.658169 + + + + 347.177451 + + + + 346.696854 + + + + 347.658169 + + + + 347.658169 + + + + 347.177451 + + + + 349.100081 + + + + 349.580800 + + + + 350.061519 + + + + 351.984150 + + + + 366.884722 + + + + 368.807475 + + + + 372.172018 + + + + 373.614052 + + + + 376.498121 + + + + 377.459436 + + + + 378.420751 + + + + 383.707925 + + + + 388.034028 + + + + 388.514747 + + + + 390.917974 + + + + 394.763358 + + + + 390.917974 + + + + 386.592116 + + + + 386.592116 + + + + 390.917974 + + + + 391.398571 + + + + 401.973407 + + + + 414.470507 + + + + 419.757925 + + + + 419.277329 + + + + 421.199959 + + + + 425.525940 + + + + 426.006537 + + + + 427.448571 + + + + 430.332517 + + + + 435.619813 + + + + 436.581251 + + + + 437.542444 + + + + 438.503881 + + + + 441.868546 + + + + 445.233089 + + + + 446.675124 + + + + 441.387828 + + + + 440.426634 + + + + 438.984478 + + + + 437.061847 + + + + 433.216585 + + + + 433.216585 + + + + 433.697182 + + + + 437.542444 + + + + 453.404454 + + + + 449.078473 + + + + 446.675124 + + + + 446.675124 + + + + 445.233089 + + + + 440.907231 + + + + 435.139216 + + + + 433.216585 + + + + 433.216585 + + + + 432.735989 + + + + 432.735989 + + + + 432.735989 + + + + 431.293833 + + + + 430.813236 + + + + 423.603187 + + + + 415.431945 + + + + 417.354698 + + + + 424.564625 + + + + 422.161153 + + + + 411.105964 + + + + 413.509314 + + + + 420.238522 + + + + 428.890605 + + + + 435.139216 + + + + 437.542444 + + + + 447.155720 + + + + 459.653187 + + + + 470.708376 + + + + 478.399021 + + + + 474.553759 + + + + 487.531579 + + + + 505.316341 + + + + 511.564953 + + + + 521.658948 + + + + 528.868997 + + + + 527.907437 + + + + 521.658948 + + + + 526.946244 + + + + 540.404904 + + + + 550.979374 + + + + 557.708948 + + + + 569.244733 + + + + 569.725452 + + + + 555.305354 + + + + 543.769447 + + + + 531.272224 + + + + 516.371530 + + + + 511.084234 + + + + 501.951676 + + + + 504.355026 + + + + 517.332967 + + + + 536.078924 + + + + 545.692200 + + + + 549.537462 + + + + 541.366097 + + + + 536.559642 + + + + 526.946244 + + + + 531.752821 + + + + 558.189667 + + + + 561.554210 + + + + 556.747511 + + + + 543.288728 + + + + 515.410337 + + + + 493.780312 + + + + 503.393589 + + + + 516.371530 + + + + 530.310909 + + + + 539.443467 + + + + 550.979374 + + + + 559.631579 + + + + 558.670141 + + + + 558.670141 + + + + 562.515403 + + + + 566.841384 + + + + 568.764014 + + + + 564.438034 + + + + 556.266792 + + + + 552.902005 + + + + 557.708948 + + + + 561.073491 + + + + 568.764014 + + + + 571.647839 + + + + 571.167364 + + + + 563.957315 + + + + 557.708948 + + + + 558.670141 + + + + 579.338606 + + + + 586.548655 + + + + 594.239423 + + + + 600.488034 + + + + 606.736645 + + + + 612.504538 + + + + 626.443917 + + + + 633.653722 + + + + 637.979946 + + + + 639.421858 + + + + 639.902577 + + + + 637.018509 + + + + 637.018509 + + + + 633.173003 + + + + 626.443917 + + + + 613.946450 + + + + 603.852577 + + + + 592.316792 + + + + 585.106743 + + + + 579.819325 + + + + 572.609520 + + + + 565.399471 + + + + 563.476841 + + + + 569.244733 + + + + 575.493345 + + + + 578.377413 + + + + 576.935501 + + + + 571.167364 + + + + 566.841384 + + + + 555.305354 + + + + 545.211481 + + + + 536.559642 + + + + 527.426841 + + + + 518.774880 + + + + 514.448899 + + + + 513.487706 + + + + 509.161603 + + + + 505.797060 + + + + 504.835623 + + + + 507.719691 + + + + 508.680884 + + + + 508.680884 + + + + 503.393589 + + + + 503.393589 + + + + 500.509642 + + + + 497.625696 + + + + 498.587011 + + + + 500.990239 + + + + 500.029046 + + + + 499.067608 + + + + 500.029046 + + + + 497.144977 + + + + 495.702943 + + + + 501.951676 + + + + 501.470958 + + + + 500.509642 + + + + 499.067608 + + + + 497.625696 + + + + 497.144977 + + + + 496.664381 + + + + 499.548327 + + + + 500.990239 + + + + 501.470958 + + + + 500.990239 + + + + 499.548327 + + + + 501.470958 + + + + 505.316341 + + + + 513.487706 + + + + 521.658948 + + + + 522.620263 + + + + 522.620263 + + + + 523.581579 + + + + 525.504210 + + + + 526.946244 + + + + 528.868997 + + + + 528.868997 + + + + 482.244405 + + + + 482.244405 + + + + 499.067608 + + + + 500.990239 + + + + 504.835623 + + + + 501.951676 + + + + 498.587011 + + + + 498.106415 + + + + 498.587011 + + + + 497.144977 + + + + 497.625696 + + + + 500.029046 + + + + 500.029046 + + + + 501.470958 + + + + 503.393589 + + + + 504.835623 + + + + 511.084234 + + + + 525.504210 + + + + 519.736195 + + + + 518.774880 + + + + 517.813564 + + + + 515.890933 + + + + 516.371530 + + + + 515.410337 + + + + 518.774880 + + + + 519.255598 + + + + 517.813564 + + + + 514.448899 + + + + 513.968302 + + + + 517.332967 + + + + 518.774880 + + + + 522.139545 + + + + 527.907437 + + + + 541.366097 + + + + 550.979374 + + + + 560.112053 + + + + 567.802577 + + + + 574.532151 + + + + 581.261481 + + + + 585.587218 + + + + 588.471530 + + + + 586.067936 + + + + 578.858132 + + + + 573.090239 + + + + 574.051432 + + + + 580.300044 + + + + 588.471530 + + + + 592.797511 + + + + 597.603966 + + + + 609.139995 + + + + 616.349800 + + + + 630.769897 + + + + 639.421858 + + + + 639.902577 + + + + 641.825208 + + + + 644.228558 + + + + 649.996450 + + + + 654.322675 + + + + 656.245061 + + + + 655.764587 + + + + 649.996450 + + + + 633.653722 + + + + 624.521286 + + + + 622.117936 + + + + 618.272431 + + + + 615.869325 + + + + 614.427169 + + + + 609.139995 + + + + 603.852577 + + + + 595.681335 + + + + 592.316792 + + + + 575.493345 + + + + 567.322102 + + + + 573.090239 + + + + 583.183868 + + + + 582.222675 + + + + 580.780763 + + + + 576.935501 + + + + 570.205927 + + + + 566.841384 + + + + 573.570958 + + + + 579.819325 + + + + 582.222675 + + + + 574.051432 + + + + 571.647839 + + + + 572.609520 + + + + 570.205927 + + + + 552.421286 + + + + 541.366097 + + + + 525.984806 + + + + 513.968302 + + + + 503.393589 + + + + 506.758254 + + + + 535.598083 + + + + 559.150860 + + + + 567.322102 + + + + 571.647839 + + + + 569.244733 + + + + 541.846816 + + + + 541.846816 + + + + 549.537462 + + + + 554.824636 + + + + 559.631579 + + + + 554.344161 + + + + 545.211481 + + + + 532.714259 + + + + 516.852249 + + + + 510.122919 + + + + 513.968302 + + + + 525.023613 + + + + 538.482273 + + + + 547.614831 + + + + 559.150860 + + + + 573.090239 + + + + 578.858132 + + + + 567.322102 + + + + 556.266792 + + + + 544.250288 + + + + 532.233540 + + + + 534.636889 + + + + 538.962870 + + + + 537.040239 + + + + 525.984806 + + + + 518.774880 + + + + 510.603515 + + + + 493.299593 + + + + 482.725124 + + + + 485.128351 + + + + 467.824429 + + + + 456.769119 + + + + 447.636439 + + + + 441.868546 + + + + 439.465075 + + + + 428.409886 + + + + 421.199959 + + + + 415.912542 + + + + 421.680556 + + + + 432.255270 + + + + 426.006537 + + + + 420.719241 + + + + 429.851798 + + + + 438.503881 + + + + 441.387828 + + + + 441.387828 + + + + 438.984478 + + + + 436.100532 + + + + 432.735989 + + + + 431.774429 + + + + 429.851798 + + + + 432.255270 + + + + 438.503881 + + + + 448.597877 + + + + 456.769119 + + + + 458.691750 + + + + 456.288522 + + + + 445.713808 + + + + 443.791177 + + + + 442.829862 + + + + 441.868546 + + + + 446.675124 + + + + 447.636439 + + + + 449.078473 + + + + 450.520507 + + + + 457.249837 + + + + 453.885172 + + + + 450.039911 + + + + 450.520507 + + + + 448.597877 + + + + 448.597877 + + + + 447.155720 + + + + 438.023163 + + + + 435.139216 + + + + 433.697182 + + + + 427.448571 + + + + 426.967974 + + + + 423.122590 + + + + 423.122590 + + + + 423.122590 + + + + 418.796610 + + + + 406.299265 + + + + 403.896038 + + + + 401.492688 + + + + 400.050776 + + + + 399.089216 + + + + 409.183333 + + + + 408.222018 + + + + 403.896038 + + + + 402.934600 + + + + 397.166585 + + + + 395.243955 + + + + 394.763358 + + + + 391.398571 + + + + 391.398571 + + + + 389.475940 + + + + 386.592116 + + + + 377.940033 + + + + 375.056086 + + + + 374.094649 + + + + 373.133455 + + + + 372.652737 + + + + 370.249387 + + + + 366.884722 + + + + 366.884722 + + + + 364.962091 + + + + 359.674795 + + + + 359.674795 + + + + 356.790727 + + + + 355.348815 + + + + 361.116829 + + + + 357.271446 + + + + 356.310130 + + + + 355.829534 + + + + 353.906903 + + + + 353.426184 + + + + 350.061519 + + + + 346.696854 + + + + 346.696854 + + + + 345.254820 + + + + 344.774223 + + + + 344.774223 + + + + 348.619485 + + + + 351.022712 + + + + 351.022712 + + + + 354.387499 + + + + 356.790727 + + + + 362.558742 + + + + 373.133455 + + + + 377.940033 + + + + 381.304698 + + + + 381.304698 + + + + 384.188766 + + + + 385.150082 + + + + 253.928511 + + + + 253.928511 + + + + + diff --git a/reference/track/pathaway.mps b/reference/track/pathaway.mps deleted file mode 100644 index 79061fa8a5d92f9286c66fe57f23e56759a3ca5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15468 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 diff --git a/reference/track/trackfilter-new.gpx b/reference/track/trackfilter-new.gpx new file mode 100644 index 000000000..faf61117a --- /dev/null +++ b/reference/track/trackfilter-new.gpx @@ -0,0 +1,280 @@ + + + + + LOG-20020525 + + + 1.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 2.000000 + + + + 0.000000 + + + + 1.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 2.000000 + + + + 1.000000 + + + + 1.000000 + + + + 0.000000 + + + + 2.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 6.000000 + + + + 2.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 1.000000 + + + + 0.000000 + + + + 0.000000 + + + + 6.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + + + LOG-20020526 + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 7.000000 + + + + 0.000000 + + + + + + LOG-20020527 + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + 0.000000 + + + + + diff --git a/reference/track/trackfilter.gpx b/reference/track/trackfilter.gpx new file mode 100644 index 000000000..88190adb9 --- /dev/null +++ b/reference/track/trackfilter.gpx @@ -0,0 +1,269 @@ + + + + + + +1.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +2.000000 + + + +0.000000 + + + +1.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +2.000000 + + + +1.000000 + + + +1.000000 + + + +0.000000 + + + +2.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +6.000000 + + + +2.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +1.000000 + + + +0.000000 + + + +0.000000 + + + +6.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +7.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + +0.000000 + + + + + diff --git a/reference/track/tracks.gpx b/reference/track/tracks.gpx index 9b310b514..c606cd414 100644 --- a/reference/track/tracks.gpx +++ b/reference/track/tracks.gpx @@ -8,259 +8,259 @@ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/ - + 1.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 2.000000 - + 0.000000 - + 1.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 2.000000 - + 1.000000 - + 1.000000 - + 0.000000 - + 2.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 6.000000 - + 2.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 1.000000 - + 0.000000 - + 0.000000 - + 6.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 7.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 - + 0.000000 diff --git a/reference/track/vitosmt_t.gpx b/reference/track/vitosmt_t.gpx new file mode 100644 index 000000000..f692d17b2 --- /dev/null +++ b/reference/track/vitosmt_t.gpx @@ -0,0 +1,2203 @@ + + + + + + + 33.700000 + + 0.000000 + 0.000000 + WP0001 + 2d + 3 + 30.600000 + + + 33.700000 + + 0.000000 + 0.000000 + WP0002 + 2d + 3 + 30.600000 + + + 105.400000 + + 251.259995 + 1.419867 + WP0003 + dgps + 7 + 1.400000 + + + 104.600000 + + 260.420013 + 1.450733 + WP0004 + dgps + 5 + 2.400000 + + + 102.500000 + + 232.600006 + 0.334389 + WP0005 + dgps + 5 + 2.400000 + + + 108.900000 + + 297.440002 + 1.106055 + WP0006 + dgps + 6 + 2.200000 + + + 108.400000 + + 290.190002 + 1.162644 + WP0007 + dgps + 9 + 1.000000 + + + 110.600000 + + 30.709999 + 1.111200 + WP0008 + dgps + 8 + 1.400000 + + + 106.200000 + + 32.630001 + 0.185200 + WP0009 + dgps + 10 + 1.000000 + + + 34.100000 + + 0.000000 + 0.000000 + WP0010 + 2d + 3 + 7.000000 + + + -22.300000 + + 150.550003 + 1.476456 + WP0011 + dgps + 5 + 2.600000 + + + -34.800000 + + 140.809998 + 1.533044 + WP0012 + 3d + 4 + 3.400000 + + + -28.700000 + + 165.830002 + 1.342700 + WP0013 + dgps + 5 + 2.600000 + + + -21.000000 + + 166.179993 + 0.735656 + WP0014 + 3d + 4 + 3.800000 + + + -25.300000 + + 114.070000 + 1.507322 + WP0015 + 2 + + + 43.400000 + + 79.120003 + 1.517611 + WP0016 + 3d + 4 + 3.800000 + + + 39.300000 + + 65.169998 + 1.378711 + WP0017 + dgps + 6 + 1.600000 + + + 48.300000 + + 87.449997 + 1.260389 + WP0018 + dgps + 5 + 1.600000 + + + 44.500000 + + 88.230003 + 1.476456 + WP0019 + dgps + 5 + 1.600000 + + + 39.900000 + + 68.449997 + 1.558767 + WP0020 + dgps + 5 + 2.600000 + + + 23.600000 + + 140.080002 + 0.138900 + WP0021 + dgps + 5 + 2.600000 + + + 46.700000 + + 114.720001 + 0.195489 + WP0022 + 3d + 4 + 4.000000 + + + 61.300000 + + 128.500000 + 0.169767 + WP0023 + dgps + 5 + 1.600000 + + + 74.600000 + + 0.890000 + 0.262367 + WP0024 + 3d + 4 + 4.000000 + + + 63.600000 + + 214.169998 + 0.144044 + WP0025 + 3d + 4 + 2.200000 + + + 83.600000 + + 156.059998 + 0.205778 + WP0026 + 3d + 4 + 5.200000 + + + 76.200000 + + 136.899994 + 0.082311 + WP0027 + 3d + 4 + 5.200000 + + + 76.300000 + + 151.399994 + 0.108033 + WP0028 + 2d + 3 + 10.600000 + + + 59.800000 + + 0.000000 + 0.000000 + WP0029 + 3d + 4 + 5.200000 + + + 34.300000 + + 0.000000 + 0.000000 + WP0030 + 2d + 3 + 25.400000 + + + 34.300000 + + 0.000000 + 0.000000 + WP0031 + 2d + 3 + 28.200001 + + + 34.300000 + + 157.210007 + 0.036011 + WP0032 + 2d + 3 + 28.200001 + + + 70.800000 + + 31.549999 + 0.118322 + WP0033 + dgps + 5 + 1.800000 + + + 61.200000 + + 160.520004 + 1.044322 + WP0034 + 3d + 4 + 2.000000 + + + 62.400000 + + 162.570007 + 0.102889 + WP0035 + 1 + + + 54.200000 + + 66.839996 + 0.411556 + WP0036 + 3d + 4 + 6.800000 + + + 57.000000 + + 0.000000 + 0.000000 + WP0037 + 3d + 4 + 19.400000 + + + 0.000000 + + 0.000000 + 0.000000 + WP0038 + 24.700001 + + + 57.600000 + + 0.000000 + 0.000000 + WP0039 + 3d + 4 + 17.799999 + + + 74.800000 + + 51.320000 + 0.087456 + WP0040 + dgps + 7 + 1.000000 + + + 95.100000 + + 22.510000 + 0.092600 + WP0041 + dgps + 5 + 1.600000 + + + 69.100000 + + 272.899994 + 1.208944 + WP0042 + dgps + 7 + 1.000000 + + + 71.300000 + + 304.450012 + 1.188367 + WP0043 + dgps + 7 + 1.000000 + + + 71.300000 + + 321.899994 + 1.332411 + WP0044 + dgps + 6 + 1.400000 + + + 71.300000 + + 346.209991 + 0.853978 + WP0045 + dgps + 6 + 1.400000 + + + 70.700000 + + 31.530001 + 0.041156 + WP0046 + dgps + 6 + 1.400000 + + + 68.400000 + + 124.980003 + 0.807678 + WP0047 + dgps + 6 + 1.200000 + + + 72.900000 + + 301.549988 + 1.301544 + WP0048 + dgps + 6 + 1.200000 + + + 71.400000 + + 312.899994 + 0.488722 + WP0049 + dgps + 7 + 1.000000 + + + 71.200000 + + 54.860001 + 0.077167 + WP0050 + dgps + 8 + 1.000000 + + + 71.600000 + + 338.209991 + 1.821133 + WP0051 + dgps + 7 + 1.400000 + + + 71.000000 + + 300.459991 + 0.632767 + WP0052 + 2 + + + 72.100000 + + 306.429993 + 1.059756 + WP0053 + 2 + + + 72.700000 + + 284.540009 + 0.967156 + WP0054 + 2d + 3 + 6.200000 + + + 72.200000 + + 310.510010 + 0.648200 + WP0055 + 2 + + + 72.500000 + + 208.550003 + 0.529878 + WP0056 + 2 + + + 73.000000 + + 292.980011 + 1.574200 + WP0057 + 2 + + + 73.300000 + + 348.260010 + 1.409578 + WP0058 + 2d + 3 + 19.400000 + + + 78.100000 + + 357.940002 + 1.352989 + WP0059 + 2d + 3 + 6.000000 + + + 77.000000 + + 341.100006 + 0.905422 + WP0060 + 3d + 4 + 4.200000 + + + 75.500000 + + 11.500000 + 0.216067 + WP0061 + 3d + 4 + 4.200000 + + + 71.000000 + + 26.420000 + 0.807678 + WP0062 + 3d + 4 + 12.400000 + + + 75.800000 + + 37.529999 + 1.188367 + WP0063 + 3d + 4 + 4.200000 + + + 72.600000 + + 48.630001 + 1.527900 + WP0064 + dgps + 6 + 1.600000 + + + 70.300000 + + 26.750000 + 1.059756 + WP0065 + dgps + 5 + 2.800000 + + + 74.600000 + + 201.380005 + 0.843689 + WP0066 + dgps + 5 + 1.800000 + + + 76.300000 + + 117.099998 + 0.457856 + WP0067 + dgps + 5 + 1.600000 + + + 72.100000 + + 130.149994 + 0.149189 + WP0068 + 2d + 3 + 5.200000 + + + 80.900000 + + 129.250000 + 0.313811 + WP0069 + 3d + 4 + 4.000000 + + + 89.500000 + + 87.769997 + 0.061733 + WP0070 + 3d + 4 + 4.000000 + + + 102.100000 + + 164.850006 + 0.123467 + WP0071 + 3d + 4 + 2.200000 + + + 102.800000 + + 244.000000 + 0.396122 + WP0072 + 2d + 3 + 13.400000 + + + 94.100000 + + 86.839996 + 0.812822 + WP0073 + dgps + 5 + 1.600000 + + + 93.300000 + + 216.110001 + 0.118322 + WP0074 + dgps + 5 + 1.600000 + + + 83.800000 + + 250.699997 + 1.198656 + WP0075 + 2 + + + 85.100000 + + 238.919998 + 1.656511 + WP0076 + 2 + + + 85.600000 + + 235.460007 + 1.718244 + WP0077 + 2d + 3 + 16.000000 + + + 85.900000 + + 248.250000 + 1.342700 + WP0078 + 2 + + + 85.200000 + + 260.279999 + 0.992878 + WP0079 + 3d + 4 + 2.400000 + + + 87.100000 + + 215.869995 + 1.270678 + WP0080 + 3d + 4 + 3.200000 + + + 82.300000 + + 238.919998 + 1.095767 + WP0081 + dgps + 6 + 1.200000 + + + 78.800000 + + 235.889999 + 0.992878 + WP0082 + 3d + 4 + 2.400000 + + + 75.500000 + + 228.059998 + 0.987733 + WP0083 + dgps + 5 + 1.400000 + + + 74.100000 + + 322.799988 + 1.152356 + WP0084 + 3d + 4 + 2.000000 + + + 72.500000 + + 333.309998 + 0.468144 + WP0085 + 2 + + + 74.000000 + + 154.389999 + 1.275822 + WP0086 + 2d + 3 + 40.599998 + + + 74.700000 + + 197.889999 + 1.234667 + WP0087 + 3d + 4 + 2.000000 + + + 72.300000 + + 194.039993 + 0.365256 + WP0088 + + + 72.200000 + + 237.380005 + 0.776811 + WP0089 + + + 73.000000 + + 272.200012 + 0.874556 + WP0090 + 2d + 3 + 38.200001 + + + 74.400000 + + 214.550003 + 0.174911 + WP0091 + 2 + + + 81.200000 + + 209.389999 + 0.216067 + WP0092 + 2d + 3 + 37.200001 + + + 70.100000 + + 256.739990 + 0.673922 + WP0093 + 3d + 4 + 9.400000 + + + 64.400000 + + 294.750000 + 0.817967 + WP0094 + 2 + + + 64.000000 + + 174.509995 + 0.617333 + WP0095 + 1 + + + 64.600000 + + 122.470001 + 0.720222 + WP0096 + 2d + 3 + 23.000000 + + + 67.300000 + + 189.600006 + 0.128611 + WP0097 + 2d + 3 + 5.200000 + + + 71.400000 + + 182.949997 + 0.108033 + WP0098 + 3d + 4 + 43.599998 + + + 71.700000 + + 52.070000 + 0.164622 + WP0099 + 2d + 3 + 24.200001 + + + 72.300000 + + 155.990005 + 0.113178 + WP0100 + 3d + 4 + 2.200000 + + + 81.200000 + + 97.730003 + 1.111200 + WP0101 + 2d + 3 + 36.400002 + + + 74.500000 + + 50.860001 + 1.625644 + WP0102 + 2 + + + 74.700000 + + 44.029999 + 1.347844 + WP0103 + 2d + 3 + 13.600000 + + + 76.200000 + + 82.080002 + 0.715078 + WP0104 + 2d + 3 + 50.000000 + + + 77.900000 + + 80.239998 + 0.745944 + WP0105 + 2d + 3 + 26.400000 + + + 78.600000 + + 47.939999 + 1.733678 + WP0106 + 3d + 4 + 50.000000 + + + 80.700000 + + 62.310001 + 1.116344 + WP0107 + dgps + 5 + 1.600000 + + + 84.400000 + + 59.770000 + 1.435300 + WP0108 + 2 + + + 92.600000 + + 57.660000 + 1.260389 + WP0109 + dgps + 5 + 2.000000 + + + 95.800000 + + 55.730000 + 1.399289 + WP0110 + 3d + 4 + 5.000000 + + + 94.700000 + + 28.459999 + 1.286111 + WP0111 + dgps + 7 + 0.800000 + + + 59.200000 + + 245.169998 + 0.972300 + WP0112 + 3d + 4 + 9.400000 + + + 55.200000 + + 240.100006 + 1.553622 + WP0113 + 2d + 3 + 6.000000 + + + 56.100000 + + 238.809998 + 1.265533 + WP0114 + 2d + 3 + 7.600000 + + + 54.500000 + + 242.740005 + 1.183222 + WP0115 + 3d + 4 + 11.800000 + + + 48.700000 + + 236.539993 + 1.003167 + WP0116 + 2 + + + 43.700000 + + 261.720001 + 1.713100 + WP0117 + 2d + 3 + 7.200000 + + + 45.100000 + + 298.739990 + 1.265533 + WP0118 + 2 + + + 44.600000 + + 313.660004 + 1.188367 + WP0119 + 3d + 4 + 16.600000 + + + 44.100000 + + 330.829987 + 1.347844 + WP0120 + 2 + + + 43.000000 + + 334.989990 + 1.198656 + WP0121 + 2 + + + 42.000000 + + 341.049988 + 1.687378 + WP0122 + 2d + 3 + 7.200000 + + + 41.400000 + + 1.620000 + 1.594778 + WP0123 + 2d + 3 + 6.800000 + + + 41.600000 + + 18.180000 + 1.106055 + WP0124 + 2d + 3 + 6.800000 + + + 41.600000 + + 10.700000 + 1.311833 + WP0125 + 1 + + + 41.600000 + + 333.260010 + 0.766522 + WP0126 + 2d + 3 + 7.000000 + + + 41.600000 + + 348.489990 + 1.126633 + WP0127 + 2 + + + 41.600000 + + 335.130005 + 1.106055 + WP0128 + 2 + + + 41.600000 + + 356.950012 + 1.733678 + WP0129 + 2 + + + 41.600000 + + 344.679993 + 0.977444 + WP0130 + 2 + + + 41.600000 + + 69.209999 + 1.239811 + WP0131 + 1 + + + 41.600000 + + 83.389999 + 1.491889 + WP0132 + 2d + 3 + 7.400000 + + + 41.700000 + + 93.379997 + 1.569056 + WP0133 + 3d + 4 + 33.799999 + + + 41.700000 + + 105.099998 + 1.831422 + WP0134 + 2d + 3 + 6.800000 + + + 41.800000 + + 63.990002 + 1.373567 + WP0135 + 2 + + + 42.300000 + + 67.769997 + 1.769689 + WP0136 + 3d + 4 + 21.799999 + + + 45.200000 + + 108.410004 + 1.358133 + WP0137 + 2d + 3 + 7.000000 + + + 46.700000 + + 104.510002 + 1.219233 + WP0138 + 2d + 3 + 8.400000 + + + 47.400000 + + 260.720001 + 1.023744 + WP0139 + 2d + 3 + 8.600000 + + + 48.300000 + + 274.910004 + 1.399289 + WP0140 + 2 + + + 49.000000 + + 252.429993 + 0.802533 + WP0141 + + + 49.400000 + + 174.869995 + 0.504156 + WP0142 + 2 + + + 49.900000 + + 223.550003 + 0.838544 + WP0143 + 3d + 4 + 8.200000 + + + 49.500000 + + 255.070007 + 1.244956 + WP0144 + 2d + 3 + 6.400000 + + + 55.000000 + + 267.149994 + 1.080333 + WP0145 + 2d + 3 + 9.400000 + + + 56.600000 + + 158.740005 + 0.761378 + WP0146 + 2d + 3 + 5.400000 + + + 56.100000 + + 233.080002 + 1.121489 + WP0147 + 2d + 3 + 10.000000 + + + 56.700000 + + 150.190002 + 0.169767 + WP0148 + 2 + + + 70.600000 + + 155.179993 + 0.915711 + WP0149 + 3d + 4 + 5.200000 + + + 75.600000 + + 137.089996 + 0.571033 + WP0150 + 3d + 4 + 5.000000 + + + 76.100000 + + 356.690002 + 0.226356 + WP0151 + 2d + 3 + 10.600000 + + + 77.400000 + + 233.190002 + 0.926000 + WP0152 + 2d + 3 + 6.400000 + + + 84.500000 + + 66.459999 + 1.075189 + WP0153 + 1 + + + 90.200000 + + 285.640015 + 0.853978 + WP0154 + 2 + + + 93.200000 + + 250.550003 + 1.214089 + WP0155 + 2 + + + 94.400000 + + 245.679993 + 1.100911 + WP0156 + 2d + 3 + 6.400000 + + + 95.400000 + + 244.559998 + 1.188367 + WP0157 + 2 + + + 96.500000 + + 262.299988 + 1.671944 + WP0158 + 2d + 3 + 6.200000 + + + 96.300000 + + 207.820007 + 1.070044 + WP0159 + 2 + + + 97.000000 + + 269.070007 + 1.404433 + WP0160 + 2d + 3 + 6.200000 + + + 96.900000 + + 229.419998 + 0.982589 + WP0161 + 2 + + + 98.200000 + + 242.610001 + 0.730511 + WP0162 + 2d + 3 + 6.200000 + + + 98.600000 + + 220.550003 + 1.497033 + WP0163 + 2d + 3 + 6.200000 + + + 98.400000 + + 237.889999 + 1.106055 + WP0164 + 2 + + + 98.200000 + + 253.720001 + 1.445589 + WP0165 + 2d + 3 + 6.200000 + + + 97.000000 + + 224.910004 + 2.515633 + WP0166 + 2d + 3 + 6.200000 + + + 96.600000 + + 204.449997 + 2.459044 + WP0167 + 2d + 3 + 13.400000 + + + 96.100000 + + 185.449997 + 2.165811 + WP0168 + 3d + 4 + 3.200000 + + + 94.800000 + + 157.490005 + 2.021767 + WP0169 + 2d + 3 + 13.400000 + + + 95.200000 + + 137.639999 + 1.764544 + WP0170 + 2d + 3 + 13.600000 + + + 93.600000 + + 83.290001 + 1.455878 + WP0171 + 2d + 3 + 8.800000 + + + 92.400000 + + 86.800003 + 0.895133 + WP0172 + 3d + 4 + 3.000000 + + + 91.200000 + + 79.180000 + 0.828256 + WP0173 + 3d + 4 + 3.000000 + + + 92.400000 + + 82.589996 + 0.766522 + WP0174 + 2d + 3 + 6.200000 + + + 94.400000 + + 67.809998 + 0.956867 + WP0175 + 3d + 4 + 2.800000 + + + 92.800000 + + 43.900002 + 1.260389 + WP0176 + 3d + 4 + 2.800000 + + + 94.900000 + + 81.980003 + 1.142067 + WP0177 + 2d + 3 + 9.000000 + + + 95.600000 + + 109.800003 + 0.056589 + WP0178 + 3d + 4 + 2.800000 + + + 96.300000 + + 206.750000 + 0.627622 + WP0179 + 2d + 3 + 9.200000 + + + 96.300000 + + 186.479996 + 0.735656 + WP0180 + 1 + + + 98.800000 + + 185.270004 + 0.483578 + WP0181 + 3d + 4 + 2.600000 + + + 97.900000 + + 166.690002 + 6.152756 + WP0182 + 2d + 3 + 9.600000 + + + 97.600000 + + 166.690002 + 6.152756 + WP0183 + 1 + + + 97.300000 + + 166.690002 + 6.152756 + WP0184 + + + 97.500000 + + 131.520004 + 24.652178 + WP0185 + 2 + + + 97.700000 + + 135.419998 + 23.268322 + WP0186 + 2 + + + 98.100000 + + 144.899994 + 21.025345 + WP0187 + 2 + + + 98.200000 + + 147.210007 + 20.654945 + WP0188 + 2 + + + 98.200000 + + 147.210007 + 20.654945 + WP0189 + + + 97.900000 + + 160.369995 + 15.068078 + WP0190 + 2 + + + 97.800000 + + 182.169998 + 9.877334 + WP0191 + 1 + + + 101.300000 + + 174.380005 + 7.963600 + WP0192 + 2 + + + 105.300000 + + 179.320007 + 8.323711 + WP0193 + 2d + 3 + 10.000000 + + + 105.600000 + + 183.029999 + 8.267122 + WP0194 + 2 + + + 105.700000 + + 183.029999 + 8.267122 + WP0195 + 1 + + + 104.700000 + + 126.190002 + 4.876933 + WP0196 + 2 + + + 103.600000 + + 83.410004 + 14.347856 + WP0197 + 2 + + + 101.300000 + + 84.290001 + 13.828267 + WP0198 + 2 + + + 99.900000 + + 109.540001 + 15.947778 + WP0199 + 2d + 3 + 2.600000 + + + 98.100000 + + 115.199997 + 14.759411 + WP0200 + 1 + + + 97.900000 + + 105.970001 + 16.909788 + WP0201 + 2 + + + 97.700000 + + 105.970001 + 16.909788 + WP0202 + 1 + + + 97.700000 + + 87.070000 + 14.203811 + WP0203 + 2 + + + 97.700000 + + 85.029999 + 14.121500 + WP0204 + 2 + + + 97.500000 + + 84.540001 + 18.633179 + WP0205 + 2 + + + 97.300000 + + 84.480003 + 19.055021 + WP0206 + 2 + + + 97.100000 + + 84.480003 + 19.055021 + WP0207 + 1 + + + 97.000000 + + 84.480003 + 19.055021 + WP0208 + 1 + + + 97.100000 + + 86.349998 + 7.526322 + WP0209 + 2d + 3 + 6.400000 + + + 97.200000 + + 103.959999 + 0.164622 + WP0210 + 2d + 3 + 6.400000 + + + 97.100000 + + 198.320007 + 0.174911 + WP0211 + 2d + 3 + 6.400000 + + + 96.900000 + + 2.360000 + 0.920856 + WP0212 + 1 + + + 96.900000 + + 81.510002 + 14.769700 + WP0213 + 2 + + + 97.300000 + + 94.290001 + 4.218444 + WP0214 + + + 97.200000 + + 90.029999 + 1.450733 + WP0215 + 2d + 3 + 6.400000 + + + 97.200000 + + 91.970001 + 1.430156 + WP0216 + 2 + + + 97.100000 + + 93.570000 + 15.705989 + WP0217 + 1 + + + 97.400000 + + 93.570000 + 15.705989 + WP0218 + + + 97.500000 + + 76.129997 + 14.399300 + WP0219 + 2 + + + 97.500000 + + 75.209999 + 14.574211 + WP0220 + 1 + + + 97.500000 + + 75.209999 + 14.574211 + WP0221 + 1 + + + 97.400000 + + 75.209999 + 14.574211 + WP0222 + 1 + + + 97.400000 + + 90.370003 + 13.159489 + WP0223 + + + 97.300000 + + 111.029999 + 13.776822 + WP0224 + 2 + + + 97.300000 + + 126.019997 + 15.505356 + WP0225 + 2 + + + 99.000000 + + 171.699997 + 10.607844 + WP0226 + 2d + 3 + 2.000000 + + + 99.300000 + + 154.520004 + 6.543733 + WP0227 + 2 + + + 99.200000 + + 159.869995 + 0.133756 + WP0228 + 2d + 3 + 2.000000 + + + 99.000000 + + 169.960007 + 0.154333 + WP0229 + 2d + 3 + 2.000000 + + + 98.600000 + + 167.100006 + 1.152356 + WP0230 + 2d + 3 + 2.000000 + + + 98.300000 + + 318.260010 + 0.864267 + WP0231 + 1 + + + 98.000000 + + 76.680000 + 1.646222 + WP0232 + 1 + + + 98.200000 + + 47.889999 + 3.251289 + WP0233 + 1 + + + 98.400000 + + 47.889999 + 3.251289 + WP0234 + 1 + + + 98.400000 + + 240.000000 + 0.123467 + WP0235 + 2d + 3 + 2.000000 + + + 98.100000 + + 159.000000 + 0.128611 + WP0236 + 2 + + + 97.400000 + + 247.240005 + 0.334389 + WP0237 + 2 + + + + diff --git a/reference/vitosmt.gpx b/reference/vitosmt.gpx new file mode 100644 index 000000000..543661ff6 --- /dev/null +++ b/reference/vitosmt.gpx @@ -0,0 +1,2200 @@ + + + + + + 33.700000 + + WP0001 + WP0001 + WP0001 + 2d + 3 + 30.600000 + + + 33.700000 + + WP0002 + WP0002 + WP0002 + 2d + 3 + 30.600000 + + + 105.400000 + + WP0003 + WP0003 + WP0003 + dgps + 7 + 1.400000 + + + 104.600000 + + WP0004 + WP0004 + WP0004 + dgps + 5 + 2.400000 + + + 102.500000 + + WP0005 + WP0005 + WP0005 + dgps + 5 + 2.400000 + + + 108.900000 + + WP0006 + WP0006 + WP0006 + dgps + 6 + 2.200000 + + + 108.400000 + + WP0007 + WP0007 + WP0007 + dgps + 9 + 1.000000 + + + 110.600000 + + WP0008 + WP0008 + WP0008 + dgps + 8 + 1.400000 + + + 106.200000 + + WP0009 + WP0009 + WP0009 + dgps + 10 + 1.000000 + + + 34.100000 + + WP0010 + WP0010 + WP0010 + 2d + 3 + 7.000000 + + + -22.300000 + + WP0011 + WP0011 + WP0011 + dgps + 5 + 2.600000 + + + -34.800000 + + WP0012 + WP0012 + WP0012 + 3d + 4 + 3.400000 + + + -28.700000 + + WP0013 + WP0013 + WP0013 + dgps + 5 + 2.600000 + + + -21.000000 + + WP0014 + WP0014 + WP0014 + 3d + 4 + 3.800000 + + + -25.300000 + + WP0015 + WP0015 + WP0015 + 2 + + + 43.400000 + + WP0016 + WP0016 + WP0016 + 3d + 4 + 3.800000 + + + 39.300000 + + WP0017 + WP0017 + WP0017 + dgps + 6 + 1.600000 + + + 48.300000 + + WP0018 + WP0018 + WP0018 + dgps + 5 + 1.600000 + + + 44.500000 + + WP0019 + WP0019 + WP0019 + dgps + 5 + 1.600000 + + + 39.900000 + + WP0020 + WP0020 + WP0020 + dgps + 5 + 2.600000 + + + 23.600000 + + WP0021 + WP0021 + WP0021 + dgps + 5 + 2.600000 + + + 46.700000 + + WP0022 + WP0022 + WP0022 + 3d + 4 + 4.000000 + + + 61.300000 + + WP0023 + WP0023 + WP0023 + dgps + 5 + 1.600000 + + + 74.600000 + + WP0024 + WP0024 + WP0024 + 3d + 4 + 4.000000 + + + 63.600000 + + WP0025 + WP0025 + WP0025 + 3d + 4 + 2.200000 + + + 83.600000 + + WP0026 + WP0026 + WP0026 + 3d + 4 + 5.200000 + + + 76.200000 + + WP0027 + WP0027 + WP0027 + 3d + 4 + 5.200000 + + + 76.300000 + + WP0028 + WP0028 + WP0028 + 2d + 3 + 10.600000 + + + 59.800000 + + WP0029 + WP0029 + WP0029 + 3d + 4 + 5.200000 + + + 34.300000 + + WP0030 + WP0030 + WP0030 + 2d + 3 + 25.400000 + + + 34.300000 + + WP0031 + WP0031 + WP0031 + 2d + 3 + 28.200001 + + + 34.300000 + + WP0032 + WP0032 + WP0032 + 2d + 3 + 28.200001 + + + 70.800000 + + WP0033 + WP0033 + WP0033 + dgps + 5 + 1.800000 + + + 61.200000 + + WP0034 + WP0034 + WP0034 + 3d + 4 + 2.000000 + + + 62.400000 + + WP0035 + WP0035 + WP0035 + 1 + + + 54.200000 + + WP0036 + WP0036 + WP0036 + 3d + 4 + 6.800000 + + + 57.000000 + + WP0037 + WP0037 + WP0037 + 3d + 4 + 19.400000 + + + 0.000000 + + WP0038 + WP0038 + WP0038 + 24.700001 + + + 57.600000 + + WP0039 + WP0039 + WP0039 + 3d + 4 + 17.799999 + + + 74.800000 + + WP0040 + WP0040 + WP0040 + dgps + 7 + 1.000000 + + + 95.100000 + + WP0041 + WP0041 + WP0041 + dgps + 5 + 1.600000 + + + 69.100000 + + WP0042 + WP0042 + WP0042 + dgps + 7 + 1.000000 + + + 71.300000 + + WP0043 + WP0043 + WP0043 + dgps + 7 + 1.000000 + + + 71.300000 + + WP0044 + WP0044 + WP0044 + dgps + 6 + 1.400000 + + + 71.300000 + + WP0045 + WP0045 + WP0045 + dgps + 6 + 1.400000 + + + 70.700000 + + WP0046 + WP0046 + WP0046 + dgps + 6 + 1.400000 + + + 68.400000 + + WP0047 + WP0047 + WP0047 + dgps + 6 + 1.200000 + + + 72.900000 + + WP0048 + WP0048 + WP0048 + dgps + 6 + 1.200000 + + + 71.400000 + + WP0049 + WP0049 + WP0049 + dgps + 7 + 1.000000 + + + 71.200000 + + WP0050 + WP0050 + WP0050 + dgps + 8 + 1.000000 + + + 71.600000 + + WP0051 + WP0051 + WP0051 + dgps + 7 + 1.400000 + + + 71.000000 + + WP0052 + WP0052 + WP0052 + 2 + + + 72.100000 + + WP0053 + WP0053 + WP0053 + 2 + + + 72.700000 + + WP0054 + WP0054 + WP0054 + 2d + 3 + 6.200000 + + + 72.200000 + + WP0055 + WP0055 + WP0055 + 2 + + + 72.500000 + + WP0056 + WP0056 + WP0056 + 2 + + + 73.000000 + + WP0057 + WP0057 + WP0057 + 2 + + + 73.300000 + + WP0058 + WP0058 + WP0058 + 2d + 3 + 19.400000 + + + 78.100000 + + WP0059 + WP0059 + WP0059 + 2d + 3 + 6.000000 + + + 77.000000 + + WP0060 + WP0060 + WP0060 + 3d + 4 + 4.200000 + + + 75.500000 + + WP0061 + WP0061 + WP0061 + 3d + 4 + 4.200000 + + + 71.000000 + + WP0062 + WP0062 + WP0062 + 3d + 4 + 12.400000 + + + 75.800000 + + WP0063 + WP0063 + WP0063 + 3d + 4 + 4.200000 + + + 72.600000 + + WP0064 + WP0064 + WP0064 + dgps + 6 + 1.600000 + + + 70.300000 + + WP0065 + WP0065 + WP0065 + dgps + 5 + 2.800000 + + + 74.600000 + + WP0066 + WP0066 + WP0066 + dgps + 5 + 1.800000 + + + 76.300000 + + WP0067 + WP0067 + WP0067 + dgps + 5 + 1.600000 + + + 72.100000 + + WP0068 + WP0068 + WP0068 + 2d + 3 + 5.200000 + + + 80.900000 + + WP0069 + WP0069 + WP0069 + 3d + 4 + 4.000000 + + + 89.500000 + + WP0070 + WP0070 + WP0070 + 3d + 4 + 4.000000 + + + 102.100000 + + WP0071 + WP0071 + WP0071 + 3d + 4 + 2.200000 + + + 102.800000 + + WP0072 + WP0072 + WP0072 + 2d + 3 + 13.400000 + + + 94.100000 + + WP0073 + WP0073 + WP0073 + dgps + 5 + 1.600000 + + + 93.300000 + + WP0074 + WP0074 + WP0074 + dgps + 5 + 1.600000 + + + 83.800000 + + WP0075 + WP0075 + WP0075 + 2 + + + 85.100000 + + WP0076 + WP0076 + WP0076 + 2 + + + 85.600000 + + WP0077 + WP0077 + WP0077 + 2d + 3 + 16.000000 + + + 85.900000 + + WP0078 + WP0078 + WP0078 + 2 + + + 85.200000 + + WP0079 + WP0079 + WP0079 + 3d + 4 + 2.400000 + + + 87.100000 + + WP0080 + WP0080 + WP0080 + 3d + 4 + 3.200000 + + + 82.300000 + + WP0081 + WP0081 + WP0081 + dgps + 6 + 1.200000 + + + 78.800000 + + WP0082 + WP0082 + WP0082 + 3d + 4 + 2.400000 + + + 75.500000 + + WP0083 + WP0083 + WP0083 + dgps + 5 + 1.400000 + + + 74.100000 + + WP0084 + WP0084 + WP0084 + 3d + 4 + 2.000000 + + + 72.500000 + + WP0085 + WP0085 + WP0085 + 2 + + + 74.000000 + + WP0086 + WP0086 + WP0086 + 2d + 3 + 40.599998 + + + 74.700000 + + WP0087 + WP0087 + WP0087 + 3d + 4 + 2.000000 + + + 72.300000 + + WP0088 + WP0088 + WP0088 + + + 72.200000 + + WP0089 + WP0089 + WP0089 + + + 73.000000 + + WP0090 + WP0090 + WP0090 + 2d + 3 + 38.200001 + + + 74.400000 + + WP0091 + WP0091 + WP0091 + 2 + + + 81.200000 + + WP0092 + WP0092 + WP0092 + 2d + 3 + 37.200001 + + + 70.100000 + + WP0093 + WP0093 + WP0093 + 3d + 4 + 9.400000 + + + 64.400000 + + WP0094 + WP0094 + WP0094 + 2 + + + 64.000000 + + WP0095 + WP0095 + WP0095 + 1 + + + 64.600000 + + WP0096 + WP0096 + WP0096 + 2d + 3 + 23.000000 + + + 67.300000 + + WP0097 + WP0097 + WP0097 + 2d + 3 + 5.200000 + + + 71.400000 + + WP0098 + WP0098 + WP0098 + 3d + 4 + 43.599998 + + + 71.700000 + + WP0099 + WP0099 + WP0099 + 2d + 3 + 24.200001 + + + 72.300000 + + WP0100 + WP0100 + WP0100 + 3d + 4 + 2.200000 + + + 81.200000 + + WP0101 + WP0101 + WP0101 + 2d + 3 + 36.400002 + + + 74.500000 + + WP0102 + WP0102 + WP0102 + 2 + + + 74.700000 + + WP0103 + WP0103 + WP0103 + 2d + 3 + 13.600000 + + + 76.200000 + + WP0104 + WP0104 + WP0104 + 2d + 3 + 50.000000 + + + 77.900000 + + WP0105 + WP0105 + WP0105 + 2d + 3 + 26.400000 + + + 78.600000 + + WP0106 + WP0106 + WP0106 + 3d + 4 + 50.000000 + + + 80.700000 + + WP0107 + WP0107 + WP0107 + dgps + 5 + 1.600000 + + + 84.400000 + + WP0108 + WP0108 + WP0108 + 2 + + + 92.600000 + + WP0109 + WP0109 + WP0109 + dgps + 5 + 2.000000 + + + 95.800000 + + WP0110 + WP0110 + WP0110 + 3d + 4 + 5.000000 + + + 94.700000 + + WP0111 + WP0111 + WP0111 + dgps + 7 + 0.800000 + + + 59.200000 + + WP0112 + WP0112 + WP0112 + 3d + 4 + 9.400000 + + + 55.200000 + + WP0113 + WP0113 + WP0113 + 2d + 3 + 6.000000 + + + 56.100000 + + WP0114 + WP0114 + WP0114 + 2d + 3 + 7.600000 + + + 54.500000 + + WP0115 + WP0115 + WP0115 + 3d + 4 + 11.800000 + + + 48.700000 + + WP0116 + WP0116 + WP0116 + 2 + + + 43.700000 + + WP0117 + WP0117 + WP0117 + 2d + 3 + 7.200000 + + + 45.100000 + + WP0118 + WP0118 + WP0118 + 2 + + + 44.600000 + + WP0119 + WP0119 + WP0119 + 3d + 4 + 16.600000 + + + 44.100000 + + WP0120 + WP0120 + WP0120 + 2 + + + 43.000000 + + WP0121 + WP0121 + WP0121 + 2 + + + 42.000000 + + WP0122 + WP0122 + WP0122 + 2d + 3 + 7.200000 + + + 41.400000 + + WP0123 + WP0123 + WP0123 + 2d + 3 + 6.800000 + + + 41.600000 + + WP0124 + WP0124 + WP0124 + 2d + 3 + 6.800000 + + + 41.600000 + + WP0125 + WP0125 + WP0125 + 1 + + + 41.600000 + + WP0126 + WP0126 + WP0126 + 2d + 3 + 7.000000 + + + 41.600000 + + WP0127 + WP0127 + WP0127 + 2 + + + 41.600000 + + WP0128 + WP0128 + WP0128 + 2 + + + 41.600000 + + WP0129 + WP0129 + WP0129 + 2 + + + 41.600000 + + WP0130 + WP0130 + WP0130 + 2 + + + 41.600000 + + WP0131 + WP0131 + WP0131 + 1 + + + 41.600000 + + WP0132 + WP0132 + WP0132 + 2d + 3 + 7.400000 + + + 41.700000 + + WP0133 + WP0133 + WP0133 + 3d + 4 + 33.799999 + + + 41.700000 + + WP0134 + WP0134 + WP0134 + 2d + 3 + 6.800000 + + + 41.800000 + + WP0135 + WP0135 + WP0135 + 2 + + + 42.300000 + + WP0136 + WP0136 + WP0136 + 3d + 4 + 21.799999 + + + 45.200000 + + WP0137 + WP0137 + WP0137 + 2d + 3 + 7.000000 + + + 46.700000 + + WP0138 + WP0138 + WP0138 + 2d + 3 + 8.400000 + + + 47.400000 + + WP0139 + WP0139 + WP0139 + 2d + 3 + 8.600000 + + + 48.300000 + + WP0140 + WP0140 + WP0140 + 2 + + + 49.000000 + + WP0141 + WP0141 + WP0141 + + + 49.400000 + + WP0142 + WP0142 + WP0142 + 2 + + + 49.900000 + + WP0143 + WP0143 + WP0143 + 3d + 4 + 8.200000 + + + 49.500000 + + WP0144 + WP0144 + WP0144 + 2d + 3 + 6.400000 + + + 55.000000 + + WP0145 + WP0145 + WP0145 + 2d + 3 + 9.400000 + + + 56.600000 + + WP0146 + WP0146 + WP0146 + 2d + 3 + 5.400000 + + + 56.100000 + + WP0147 + WP0147 + WP0147 + 2d + 3 + 10.000000 + + + 56.700000 + + WP0148 + WP0148 + WP0148 + 2 + + + 70.600000 + + WP0149 + WP0149 + WP0149 + 3d + 4 + 5.200000 + + + 75.600000 + + WP0150 + WP0150 + WP0150 + 3d + 4 + 5.000000 + + + 76.100000 + + WP0151 + WP0151 + WP0151 + 2d + 3 + 10.600000 + + + 77.400000 + + WP0152 + WP0152 + WP0152 + 2d + 3 + 6.400000 + + + 84.500000 + + WP0153 + WP0153 + WP0153 + 1 + + + 90.200000 + + WP0154 + WP0154 + WP0154 + 2 + + + 93.200000 + + WP0155 + WP0155 + WP0155 + 2 + + + 94.400000 + + WP0156 + WP0156 + WP0156 + 2d + 3 + 6.400000 + + + 95.400000 + + WP0157 + WP0157 + WP0157 + 2 + + + 96.500000 + + WP0158 + WP0158 + WP0158 + 2d + 3 + 6.200000 + + + 96.300000 + + WP0159 + WP0159 + WP0159 + 2 + + + 97.000000 + + WP0160 + WP0160 + WP0160 + 2d + 3 + 6.200000 + + + 96.900000 + + WP0161 + WP0161 + WP0161 + 2 + + + 98.200000 + + WP0162 + WP0162 + WP0162 + 2d + 3 + 6.200000 + + + 98.600000 + + WP0163 + WP0163 + WP0163 + 2d + 3 + 6.200000 + + + 98.400000 + + WP0164 + WP0164 + WP0164 + 2 + + + 98.200000 + + WP0165 + WP0165 + WP0165 + 2d + 3 + 6.200000 + + + 97.000000 + + WP0166 + WP0166 + WP0166 + 2d + 3 + 6.200000 + + + 96.600000 + + WP0167 + WP0167 + WP0167 + 2d + 3 + 13.400000 + + + 96.100000 + + WP0168 + WP0168 + WP0168 + 3d + 4 + 3.200000 + + + 94.800000 + + WP0169 + WP0169 + WP0169 + 2d + 3 + 13.400000 + + + 95.200000 + + WP0170 + WP0170 + WP0170 + 2d + 3 + 13.600000 + + + 93.600000 + + WP0171 + WP0171 + WP0171 + 2d + 3 + 8.800000 + + + 92.400000 + + WP0172 + WP0172 + WP0172 + 3d + 4 + 3.000000 + + + 91.200000 + + WP0173 + WP0173 + WP0173 + 3d + 4 + 3.000000 + + + 92.400000 + + WP0174 + WP0174 + WP0174 + 2d + 3 + 6.200000 + + + 94.400000 + + WP0175 + WP0175 + WP0175 + 3d + 4 + 2.800000 + + + 92.800000 + + WP0176 + WP0176 + WP0176 + 3d + 4 + 2.800000 + + + 94.900000 + + WP0177 + WP0177 + WP0177 + 2d + 3 + 9.000000 + + + 95.600000 + + WP0178 + WP0178 + WP0178 + 3d + 4 + 2.800000 + + + 96.300000 + + WP0179 + WP0179 + WP0179 + 2d + 3 + 9.200000 + + + 96.300000 + + WP0180 + WP0180 + WP0180 + 1 + + + 98.800000 + + WP0181 + WP0181 + WP0181 + 3d + 4 + 2.600000 + + + 97.900000 + + WP0182 + WP0182 + WP0182 + 2d + 3 + 9.600000 + + + 97.600000 + + WP0183 + WP0183 + WP0183 + 1 + + + 97.300000 + + WP0184 + WP0184 + WP0184 + + + 97.500000 + + WP0185 + WP0185 + WP0185 + 2 + + + 97.700000 + + WP0186 + WP0186 + WP0186 + 2 + + + 98.100000 + + WP0187 + WP0187 + WP0187 + 2 + + + 98.200000 + + WP0188 + WP0188 + WP0188 + 2 + + + 98.200000 + + WP0189 + WP0189 + WP0189 + + + 97.900000 + + WP0190 + WP0190 + WP0190 + 2 + + + 97.800000 + + WP0191 + WP0191 + WP0191 + 1 + + + 101.300000 + + WP0192 + WP0192 + WP0192 + 2 + + + 105.300000 + + WP0193 + WP0193 + WP0193 + 2d + 3 + 10.000000 + + + 105.600000 + + WP0194 + WP0194 + WP0194 + 2 + + + 105.700000 + + WP0195 + WP0195 + WP0195 + 1 + + + 104.700000 + + WP0196 + WP0196 + WP0196 + 2 + + + 103.600000 + + WP0197 + WP0197 + WP0197 + 2 + + + 101.300000 + + WP0198 + WP0198 + WP0198 + 2 + + + 99.900000 + + WP0199 + WP0199 + WP0199 + 2d + 3 + 2.600000 + + + 98.100000 + + WP0200 + WP0200 + WP0200 + 1 + + + 97.900000 + + WP0201 + WP0201 + WP0201 + 2 + + + 97.700000 + + WP0202 + WP0202 + WP0202 + 1 + + + 97.700000 + + WP0203 + WP0203 + WP0203 + 2 + + + 97.700000 + + WP0204 + WP0204 + WP0204 + 2 + + + 97.500000 + + WP0205 + WP0205 + WP0205 + 2 + + + 97.300000 + + WP0206 + WP0206 + WP0206 + 2 + + + 97.100000 + + WP0207 + WP0207 + WP0207 + 1 + + + 97.000000 + + WP0208 + WP0208 + WP0208 + 1 + + + 97.100000 + + WP0209 + WP0209 + WP0209 + 2d + 3 + 6.400000 + + + 97.200000 + + WP0210 + WP0210 + WP0210 + 2d + 3 + 6.400000 + + + 97.100000 + + WP0211 + WP0211 + WP0211 + 2d + 3 + 6.400000 + + + 96.900000 + + WP0212 + WP0212 + WP0212 + 1 + + + 96.900000 + + WP0213 + WP0213 + WP0213 + 2 + + + 97.300000 + + WP0214 + WP0214 + WP0214 + + + 97.200000 + + WP0215 + WP0215 + WP0215 + 2d + 3 + 6.400000 + + + 97.200000 + + WP0216 + WP0216 + WP0216 + 2 + + + 97.100000 + + WP0217 + WP0217 + WP0217 + 1 + + + 97.400000 + + WP0218 + WP0218 + WP0218 + + + 97.500000 + + WP0219 + WP0219 + WP0219 + 2 + + + 97.500000 + + WP0220 + WP0220 + WP0220 + 1 + + + 97.500000 + + WP0221 + WP0221 + WP0221 + 1 + + + 97.400000 + + WP0222 + WP0222 + WP0222 + 1 + + + 97.400000 + + WP0223 + WP0223 + WP0223 + + + 97.300000 + + WP0224 + WP0224 + WP0224 + 2 + + + 97.300000 + + WP0225 + WP0225 + WP0225 + 2 + + + 99.000000 + + WP0226 + WP0226 + WP0226 + 2d + 3 + 2.000000 + + + 99.300000 + + WP0227 + WP0227 + WP0227 + 2 + + + 99.200000 + + WP0228 + WP0228 + WP0228 + 2d + 3 + 2.000000 + + + 99.000000 + + WP0229 + WP0229 + WP0229 + 2d + 3 + 2.000000 + + + 98.600000 + + WP0230 + WP0230 + WP0230 + 2d + 3 + 2.000000 + + + 98.300000 + + WP0231 + WP0231 + WP0231 + 1 + + + 98.000000 + + WP0232 + WP0232 + WP0232 + 1 + + + 98.200000 + + WP0233 + WP0233 + WP0233 + 1 + + + 98.400000 + + WP0234 + WP0234 + WP0234 + 1 + + + 98.400000 + + WP0235 + WP0235 + WP0235 + 2d + 3 + 2.000000 + + + 98.100000 + + WP0236 + WP0236 + WP0236 + 2 + + + 97.400000 + + WP0237 + WP0237 + WP0237 + 2 + + diff --git a/reference/vitosmt.smt b/reference/vitosmt.smt new file mode 100644 index 0000000000000000000000000000000000000000..3179e59aca8c47c188b2ac577070c019aa72c27a GIT binary patch literal 15192 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 NzrJOXuhHps{|97SdzSzJ literal 0 HcmV?d00001 diff --git a/reverse_route.c b/reverse_route.c index 9589c7450..5ba3a7e32 100644 --- a/reverse_route.c +++ b/reverse_route.c @@ -48,7 +48,7 @@ reverse_route_init(const char *args) case trkdata: break; default: fatal(MYNAME ": This filter only works in track " - "or route (-t or -r) mode."); + "or route (-t or -r) mode.\n"); } } diff --git a/route.c b/route.c index 750d13988..e1069f08d 100644 --- a/route.c +++ b/route.c @@ -128,10 +128,9 @@ route_free(route_head *rte) } rte_waypts -= rte->rte_waypt_ct; waypt_flush(&rte->waypoint_list); - if ( rte->an1_extras ) { - (*(rte->an1_extras->destroy))((void *)rte->an1_extras ); - xfree( rte->an1_extras ); - } + if ( rte->fs ) { + fs_chain_destroy( rte->fs ); + } xfree(rte); } diff --git a/smplrout.c b/smplrout.c index da2145635..bd9fb8dcd 100644 --- a/smplrout.c +++ b/smplrout.c @@ -55,7 +55,7 @@ free_xte( struct xte *xte_rec ) xfree(xte_rec->intermed); } -#define HUGEVAL 9e9; +#define HUGEVAL 2000000000 static struct xte_intermed *tmpprev = NULL; static int xte_count = 0; @@ -112,6 +112,13 @@ compare_xte( const void *a, const void *b ) ((struct xte *)b)->distance; int priodiff = ((struct xte *)a)->intermed->wpt->route_priority - ((struct xte *)b)->intermed->wpt->route_priority; + + if (HUGEVAL == ((struct xte *)a)->distance) + return -1; + + if (HUGEVAL == ((struct xte *)b)->distance) + return 1; + if ( priodiff < 0 ) return 1; if ( priodiff > 0 ) return -1; if ( distdiff < 0 ) return 1; @@ -233,7 +240,7 @@ routesimple_init(const char *args) { count = atol(countopt); } else { - fatal( MYNAME ": You must specify a maximum size for the new route"); + fatal( MYNAME ": You must specify a maximum size for the new route with 'count' option.\n"); } } diff --git a/strptime.c b/strptime.c new file mode 100644 index 000000000..968934ff6 --- /dev/null +++ b/strptime.c @@ -0,0 +1,1020 @@ +/* Convert a string representation of time to a time value. + Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* XXX This version of the implementation is not really complete. + Some of the fields cannot add information alone. But if seeing + some of them in the same format (such as year, week and weekday) + this is enough information for determining the date. */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#ifdef _LIBC +# include "../locale/localeinfo.h" +#endif + +#include "strptime.h" + +#ifndef __P +# if defined (__GNUC__) || (defined (__STDC__) && __STDC__) +# define __P(args) args +# else +# define __P(args) () +# endif /* GCC. */ +#endif /* Not __P. */ + +#if ! HAVE_LOCALTIME_R && ! defined localtime_r +# ifdef _LIBC +# define localtime_r __localtime_r +# else +/* Approximate localtime_r as best we can in its absence. */ +# define localtime_r my_localtime_r +static struct tm *localtime_r __P ((const time_t *, struct tm *)); +static struct tm * +localtime_r (t, tp) + const time_t *t; + struct tm *tp; +{ + struct tm *l = localtime (t); + if (! l) + return 0; + *tp = *l; + return tp; +} +# endif /* ! _LIBC */ +#endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */ + + +#define match_char(ch1, ch2) if (ch1 != ch2) return NULL +#if defined __GNUC__ && __GNUC__ >= 2 +# define match_string(cs1, s2) \ + ({ size_t len = strlen (cs1); \ + int result = strncasecmp ((cs1), (s2), len) == 0; \ + if (result) (s2) += len; \ + result; }) +#else +/* Oh come on. Get a reasonable compiler. */ +# define match_string(cs1, s2) \ + (case_ignore_strncmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1)) +/* now now, don't need to be rude .... */ +static +int +case_ignore_strncmp(const char *s1, const char *s2, int n) +{ + int rv = 0; + + while (n && ((rv = toupper(*s1) - toupper(*s2)) == 0) + && *s1) { + s1++; + s2++; + n--; + } + return rv; +} +#endif +/* We intentionally do not use isdigit() for testing because this will + lead to problems with the wide character version. */ +#define get_number(from, to, n) \ + do { \ + int __n = n; \ + val = 0; \ + while (*rp == ' ') \ + ++rp; \ + if (*rp < '0' || *rp > '9') \ + return NULL; \ + do { \ + val *= 10; \ + val += *rp++ - '0'; \ + } while (--__n > 0 && val * 10 <= to && *rp >= '0' && *rp <= '9'); \ + if (val < from || val > to) \ + return NULL; \ + } while (0) +#ifdef _NL_CURRENT +# define get_alt_number(from, to, n) \ + ({ \ + __label__ do_normal; \ + if (*decided != raw) \ + { \ + const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \ + int __n = n; \ + int any = 0; \ + while (*rp == ' ') \ + ++rp; \ + val = 0; \ + do { \ + val *= 10; \ + while (*alts != '\0') \ + { \ + size_t len = strlen (alts); \ + if (strncasecmp (alts, rp, len) == 0) \ + break; \ + alts += len + 1; \ + ++val; \ + } \ + if (*alts == '\0') \ + { \ + if (*decided == not && ! any) \ + goto do_normal; \ + /* If we haven't read anything it's an error. */ \ + if (! any) \ + return NULL; \ + /* Correct the premature multiplication. */ \ + val /= 10; \ + break; \ + } \ + else \ + *decided = loc; \ + } while (--__n > 0 && val * 10 <= to); \ + if (val < from || val > to) \ + return NULL; \ + } \ + else \ + { \ + do_normal: \ + get_number (from, to, n); \ + } \ + 0; \ + }) +#else +# define get_alt_number(from, to, n) \ + /* We don't have the alternate representation. */ \ + get_number(from, to, n) +#endif +#define recursive(new_fmt) \ + (*(new_fmt) != '\0' \ + && (rp = strptime_internal (rp, (new_fmt), tm, decided, era_cnt)) != NULL) + + +#ifdef _LIBC +/* This is defined in locale/C-time.c in the GNU libc. */ +extern const struct locale_data _nl_C_LC_TIME; +extern const unsigned short int __mon_yday[2][13]; + +# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string) +# define ab_weekday_name \ + (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string) +# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string) +# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string) +# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string) +# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string) +# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string) +# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string) +# define HERE_T_FMT_AMPM \ + (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string) +# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string) + +# define strncasecmp(s1, s2, n) __strncasecmp (s1, s2, n) +#else +static char const weekday_name[][10] = + { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" + }; +static char const ab_weekday_name[][4] = + { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" + }; +static char const month_name[][10] = + { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + }; +static char const ab_month_name[][4] = + { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; +# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y" +# define HERE_D_FMT "%m/%d/%y" +# define HERE_AM_STR "AM" +# define HERE_PM_STR "PM" +# define HERE_T_FMT_AMPM "%I:%M:%S %p" +# define HERE_T_FMT "%H:%M:%S" + +const unsigned short int __mon_yday[2][13] = + { + /* Normal years. */ + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, + /* Leap years. */ + { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } + }; +#endif + +/* Status of lookup: do we use the locale data or the raw data? */ +enum locale_status { not, loc, raw }; + + +#ifndef __isleap +/* Nonzero if YEAR is a leap year (every 4 years, + except every 100th isn't, and every 400th is). */ +# define __isleap(year) \ + ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) +#endif + +/* Compute the day of the week. */ +static void +day_of_the_week (struct tm *tm) +{ + /* We know that January 1st 1970 was a Thursday (= 4). Compute the + the difference between this data in the one on TM and so determine + the weekday. */ + int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2); + int wday = (-473 + + (365 * (tm->tm_year - 70)) + + (corr_year / 4) + - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0) + + (((corr_year / 4) / 25) / 4) + + __mon_yday[0][tm->tm_mon] + + tm->tm_mday - 1); + tm->tm_wday = ((wday % 7) + 7) % 7; +} + +/* Compute the day of the year. */ +static void +day_of_the_year (struct tm *tm) +{ + tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon] + + (tm->tm_mday - 1)); +} + +static char * +#ifdef _LIBC +internal_function +#endif +strptime_internal __P ((const char *rp, const char *fmt, struct tm *tm, + enum locale_status *decided, int era_cnt)); + +static char * +#ifdef _LIBC +internal_function +#endif +strptime_internal (rp, fmt, tm, decided, era_cnt) + const char *rp; + const char *fmt; + struct tm *tm; + enum locale_status *decided; + int era_cnt; +{ + const char *rp_backup; + int cnt; + size_t val; + int have_I, is_pm; + int century, want_century; + int want_era; + int have_wday, want_xday; + int have_yday; + int have_mon, have_mday; +#ifdef _NL_CURRENT + size_t num_eras; +#endif + struct era_entry *era; + + have_I = is_pm = 0; + century = -1; + want_century = 0; + want_era = 0; + era = NULL; + + have_wday = want_xday = have_yday = have_mon = have_mday = 0; + + while (*fmt != '\0') + { + /* A white space in the format string matches 0 more or white + space in the input string. */ + if (isspace (*fmt)) + { + while (isspace (*rp)) + ++rp; + ++fmt; + continue; + } + + /* Any character but `%' must be matched by the same character + in the iput string. */ + if (*fmt != '%') + { + match_char (*fmt++, *rp++); + continue; + } + + ++fmt; +#ifndef _NL_CURRENT + /* We need this for handling the `E' modifier. */ + start_over: +#endif + + /* Make back up of current processing pointer. */ + rp_backup = rp; + + switch (*fmt++) + { + case '%': + /* Match the `%' character itself. */ + match_char ('%', *rp++); + break; + case 'a': + case 'A': + /* Match day of week. */ + for (cnt = 0; cnt < 7; ++cnt) + { +#ifdef _NL_CURRENT + if (*decided !=raw) + { + if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt), + weekday_name[cnt])) + *decided = loc; + break; + } + if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), + ab_weekday_name[cnt])) + *decided = loc; + break; + } + } +#endif + if (*decided != loc + && (match_string (weekday_name[cnt], rp) + || match_string (ab_weekday_name[cnt], rp))) + { + *decided = raw; + break; + } + } + if (cnt == 7) + /* Does not match a weekday name. */ + return NULL; + tm->tm_wday = cnt; + have_wday = 1; + break; + case 'b': + case 'B': + case 'h': + /* Match month name. */ + for (cnt = 0; cnt < 12; ++cnt) + { +#ifdef _NL_CURRENT + if (*decided !=raw) + { + if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt), + month_name[cnt])) + *decided = loc; + break; + } + if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), + ab_month_name[cnt])) + *decided = loc; + break; + } + } +#endif + if (match_string (month_name[cnt], rp) + || match_string (ab_month_name[cnt], rp)) + { + *decided = raw; + break; + } + } + if (cnt == 12) + /* Does not match a month name. */ + return NULL; + tm->tm_mon = cnt; + want_xday = 1; + break; + case 'c': + /* Match locale's date and time format. */ +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT))) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (*decided == not && + strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT)) + *decided = loc; + want_xday = 1; + break; + } + *decided = raw; + } +#endif + if (!recursive (HERE_D_T_FMT)) + return NULL; + want_xday = 1; + break; + case 'C': + /* Match century number. */ +#ifdef _NL_CURRENT + match_century: +#endif + get_number (0, 99, 2); + century = val; + want_xday = 1; + break; + case 'd': + case 'e': + /* Match day of month. */ + get_number (1, 31, 2); + tm->tm_mday = val; + have_mday = 1; + want_xday = 1; + break; + case 'F': + if (!recursive ("%Y-%m-%d")) + return NULL; + want_xday = 1; + break; + case 'x': +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, D_FMT))) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT)) + *decided = loc; + want_xday = 1; + break; + } + *decided = raw; + } +#endif + /* Fall through. */ + case 'D': + /* Match standard day format. */ + if (!recursive (HERE_D_FMT)) + return NULL; + want_xday = 1; + break; + case 'k': + case 'H': + /* Match hour in 24-hour clock. */ + get_number (0, 23, 2); + tm->tm_hour = val; + have_I = 0; + break; + case 'I': + /* Match hour in 12-hour clock. */ + get_number (1, 12, 2); + tm->tm_hour = val % 12; + have_I = 1; + break; + case 'j': + /* Match day number of year. */ + get_number (1, 366, 3); + tm->tm_yday = val - 1; + have_yday = 1; + break; + case 'm': + /* Match number of month. */ + get_number (1, 12, 2); + tm->tm_mon = val - 1; + have_mon = 1; + want_xday = 1; + break; + case 'M': + /* Match minute. */ + get_number (0, 59, 2); + tm->tm_min = val; + break; + case 'n': + case 't': + /* Match any white space. */ + while (isspace (*rp)) + ++rp; + break; + case 'p': + /* Match locale's equivalent of AM/PM. */ +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp)) + { + if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR)) + *decided = loc; + break; + } + if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp)) + { + if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR)) + *decided = loc; + is_pm = 1; + break; + } + *decided = raw; + } +#endif + if (!match_string (HERE_AM_STR, rp)) + if (match_string (HERE_PM_STR, rp)) + is_pm = 1; + else + return NULL; + break; + case 'r': +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM))) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (*decided == not && + strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM), + HERE_T_FMT_AMPM)) + *decided = loc; + break; + } + *decided = raw; + } +#endif + if (!recursive (HERE_T_FMT_AMPM)) + return NULL; + break; + case 'R': + if (!recursive ("%H:%M")) + return NULL; + break; + case 's': + { + /* The number of seconds may be very high so we cannot use + the `get_number' macro. Instead read the number + character for character and construct the result while + doing this. */ + time_t secs = 0; + if (*rp < '0' || *rp > '9') + /* We need at least one digit. */ + return NULL; + + do + { + secs *= 10; + secs += *rp++ - '0'; + } + while (*rp >= '0' && *rp <= '9'); + + if (localtime_r (&secs, tm) == NULL) + /* Error in function. */ + return NULL; + } + break; + case 'S': + get_number (0, 61, 2); + tm->tm_sec = val; + break; + case 'X': +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, T_FMT))) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT)) + *decided = loc; + break; + } + *decided = raw; + } +#endif + /* Fall through. */ + case 'T': + if (!recursive (HERE_T_FMT)) + return NULL; + break; + case 'u': + get_number (1, 7, 1); + tm->tm_wday = val % 7; + have_wday = 1; + break; + case 'g': + get_number (0, 99, 2); + /* XXX This cannot determine any field in TM. */ + break; + case 'G': + if (*rp < '0' || *rp > '9') + return NULL; + /* XXX Ignore the number since we would need some more + information to compute a real date. */ + do + ++rp; + while (*rp >= '0' && *rp <= '9'); + break; + case 'U': + case 'V': + case 'W': + get_number (0, 53, 2); + /* XXX This cannot determine any field in TM without some + information. */ + break; + case 'w': + /* Match number of weekday. */ + get_number (0, 6, 1); + tm->tm_wday = val; + have_wday = 1; + break; + case 'y': +#ifdef _NL_CURRENT + match_year_in_century: +#endif + /* Match year within century. */ + get_number (0, 99, 2); + /* The "Year 2000: The Millennium Rollover" paper suggests that + values in the range 69-99 refer to the twentieth century. */ + tm->tm_year = val >= 69 ? val : val + 100; + /* Indicate that we want to use the century, if specified. */ + want_century = 1; + want_xday = 1; + break; + case 'Y': + /* Match year including century number. */ + get_number (0, 9999, 4); + tm->tm_year = val - 1900; + want_century = 0; + want_xday = 1; + break; + case 'Z': + /* XXX How to handle this? */ + break; + case 'E': +#ifdef _NL_CURRENT + switch (*fmt++) + { + case 'c': + /* Match locale's alternate date and time format. */ + if (*decided != raw) + { + const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT); + + if (*fmt == '\0') + fmt = _NL_CURRENT (LC_TIME, D_T_FMT); + + if (!recursive (fmt)) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (strcmp (fmt, HERE_D_T_FMT)) + *decided = loc; + want_xday = 1; + break; + } + *decided = raw; + } + /* The C locale has no era information, so use the + normal representation. */ + if (!recursive (HERE_D_T_FMT)) + return NULL; + want_xday = 1; + break; + case 'C': + if (*decided != raw) + { + if (era_cnt >= 0) + { + era = _nl_select_era_entry (era_cnt); + if (match_string (era->era_name, rp)) + { + *decided = loc; + break; + } + else + return NULL; + } + else + { + num_eras = _NL_CURRENT_WORD (LC_TIME, + _NL_TIME_ERA_NUM_ENTRIES); + for (era_cnt = 0; era_cnt < (int) num_eras; + ++era_cnt, rp = rp_backup) + { + era = _nl_select_era_entry (era_cnt); + if (match_string (era->era_name, rp)) + { + *decided = loc; + break; + } + } + if (era_cnt == (int) num_eras) + { + era_cnt = -1; + if (*decided == loc) + return NULL; + } + else + break; + } + + *decided = raw; + } + /* The C locale has no era information, so use the + normal representation. */ + goto match_century; + case 'y': + if (*decided == raw) + goto match_year_in_century; + + get_number(0, 9999, 4); + tm->tm_year = val; + want_era = 1; + want_xday = 1; + break; + case 'Y': + if (*decided != raw) + { + num_eras = _NL_CURRENT_WORD (LC_TIME, + _NL_TIME_ERA_NUM_ENTRIES); + for (era_cnt = 0; era_cnt < (int) num_eras; + ++era_cnt, rp = rp_backup) + { + era = _nl_select_era_entry (era_cnt); + if (recursive (era->era_format)) + break; + } + if (era_cnt == (int) num_eras) + { + era_cnt = -1; + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + *decided = loc; + era_cnt = -1; + break; + } + + *decided = raw; + } + get_number (0, 9999, 4); + tm->tm_year = val - 1900; + want_century = 0; + want_xday = 1; + break; + case 'x': + if (*decided != raw) + { + const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT); + + if (*fmt == '\0') + fmt = _NL_CURRENT (LC_TIME, D_FMT); + + if (!recursive (fmt)) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (strcmp (fmt, HERE_D_FMT)) + *decided = loc; + break; + } + *decided = raw; + } + if (!recursive (HERE_D_FMT)) + return NULL; + break; + case 'X': + if (*decided != raw) + { + const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT); + + if (*fmt == '\0') + fmt = _NL_CURRENT (LC_TIME, T_FMT); + + if (!recursive (fmt)) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (strcmp (fmt, HERE_T_FMT)) + *decided = loc; + break; + } + *decided = raw; + } + if (!recursive (HERE_T_FMT)) + return NULL; + break; + default: + return NULL; + } + break; +#else + /* We have no information about the era format. Just use + the normal format. */ + if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y' + && *fmt != 'x' && *fmt != 'X') + /* This is an illegal format. */ + return NULL; + + goto start_over; +#endif + case 'O': + switch (*fmt++) + { + case 'd': + case 'e': + /* Match day of month using alternate numeric symbols. */ + get_alt_number (1, 31, 2); + tm->tm_mday = val; + have_mday = 1; + want_xday = 1; + break; + case 'H': + /* Match hour in 24-hour clock using alternate numeric + symbols. */ + get_alt_number (0, 23, 2); + tm->tm_hour = val; + have_I = 0; + break; + case 'I': + /* Match hour in 12-hour clock using alternate numeric + symbols. */ + get_alt_number (1, 12, 2); + tm->tm_hour = val - 1; + have_I = 1; + break; + case 'm': + /* Match month using alternate numeric symbols. */ + get_alt_number (1, 12, 2); + tm->tm_mon = val - 1; + have_mon = 1; + want_xday = 1; + break; + case 'M': + /* Match minutes using alternate numeric symbols. */ + get_alt_number (0, 59, 2); + tm->tm_min = val; + break; + case 'S': + /* Match seconds using alternate numeric symbols. */ + get_alt_number (0, 61, 2); + tm->tm_sec = val; + break; + case 'U': + case 'V': + case 'W': + get_alt_number (0, 53, 2); + /* XXX This cannot determine any field in TM without + further information. */ + break; + case 'w': + /* Match number of weekday using alternate numeric symbols. */ + get_alt_number (0, 6, 1); + tm->tm_wday = val; + have_wday = 1; + break; + case 'y': + /* Match year within century using alternate numeric symbols. */ + get_alt_number (0, 99, 2); + tm->tm_year = val >= 69 ? val : val + 100; + want_xday = 1; + break; + default: + return NULL; + } + break; + default: + return NULL; + } + } + + if (have_I && is_pm) + tm->tm_hour += 12; + + if (century != -1) + { + if (want_century) + tm->tm_year = tm->tm_year % 100 + (century - 19) * 100; + else + /* Only the century, but not the year. Strange, but so be it. */ + tm->tm_year = (century - 19) * 100; + } + +#ifdef _NL_CURRENT + if (era_cnt != -1) + { + era = _nl_select_era_entry(era_cnt); + if (want_era) + tm->tm_year = (era->start_date[0] + + ((tm->tm_year - era->offset) + * era->absolute_direction)); + else + /* Era start year assumed. */ + tm->tm_year = era->start_date[0]; + } + else +#endif + if (want_era) + return NULL; + + if (want_xday && !have_wday) + { + if ( !(have_mon && have_mday) && have_yday) + { + /* We don't have tm_mon and/or tm_mday, compute them. */ + int t_mon = 0; + while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday) + t_mon++; + if (!have_mon) + tm->tm_mon = t_mon - 1; + if (!have_mday) + tm->tm_mday = + (tm->tm_yday + - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1); + } + day_of_the_week (tm); + } + if (want_xday && !have_yday) + day_of_the_year (tm); + + return (char *) rp; +} + + +char * +strptime (buf, format, tm) + const char *buf; + const char *format; + struct tm *tm; +{ + enum locale_status decided; + +#ifdef _NL_CURRENT + decided = not; +#else + decided = raw; +#endif + return strptime_internal (buf, format, tm, &decided, -1); +} + diff --git a/strptime.h b/strptime.h new file mode 100644 index 000000000..fe8d53edb --- /dev/null +++ b/strptime.h @@ -0,0 +1,33 @@ +/* strptime.h + * + * $Id: strptime.h,v 1.1 2005/07/16 17:02:10 robertl Exp $ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __STRPTIME_H__ +#define __STRPTIME_H__ + +/* + * Version of "strptime()", for the benefit of OSes that don't have it. + */ +extern char *strptime(const char *, const char *, struct tm *); + +#endif + diff --git a/style/README.style b/style/README.style index 9ee7a538a..b191b9bd1 100644 --- a/style/README.style +++ b/style/README.style @@ -350,6 +350,46 @@ The fields used by the XCSV parser are as follows: example: IFIELD YYYYMMDD_TIME,"","%ld" + o GMT_TIME + GMT_TIME is the waypoint's creation time, in UTC time zone. It uses the + strptime conversion format tags. + + example: IFIELD GMT_TIME,"","%m/%d/%Y %I:%M:%D %p" + + Search the web for 'strptime man page' for details strptime, but one + such page can be found at + + http://www.die.net/doc/linux/man/man3/strptime.3.html + + o LOCAL_TIME LOCAL_TIME is the waypoint's creation time, in the local + time zone. It uses strptime conversion format tags. + + example: IFIELD LOCAL_TIME,"","%y-%m-%d" + + o HMSG_TIME + HMSG_TIME parses up to three time parts and am/pm string to add + this value to the previously parsed *_TIME field that contains + only a date. On output, will print the time in UTC. + + example: IFIELD HMSG_TIME,"","%d:%d:%d %s" + + o HMSL_TIME + HMSG_TIME parses up to three time parts and am/pm string to add + this value to the previously parsed *_TIME field that contains + only a date. On output, will print the time in local time. + + example: IFIELD HMSL_TIME,"","%dh%dm" + + o ISO_TIME + ISO_TIME is the waypoint's creation time, in ISO 8601 format, + which include time zone information. + It is expected to be in the format yyyy-mm-ddThh:mm:sszzzzz + where zzzzzz is the local time offset or the character Z + for UTC time. + On output, UTC 'Z' time zone will always be used. + + example: IFIELD ISO_TIME,"","%s" + o GEOCACHE_DIFF GEOCACHE_DIFF is valid only for geocaches and represents a DOUBLE PRECISION FLOAT. A "three and a half star" cache would therefore be "3.5" @@ -409,6 +449,34 @@ The fields used by the XCSV parser are as follows: PATH_DISTANCE_KM is like PATH_DISTANCE_MILES except it outputs the length in kilometers. + o PATH_SPEED + Speed in meters per second. Gpsbabel does NOT calculate this data, it is + read from the input file if present. + + example: PATH_SPEED,"","%f" + + o PATH_COURSE + Course in degerees. Gpsbabel does NOT calculate this data, it is + read from the input file if present. + + example: PATH_COURSE,"","%f" + + o GPS_HDOP, GPS_VDOP, GPS_PDOP + GPS distorsion of position parameters. Needs float conversion. + + example: GPS_HDOP,"","%f" + + o GPS_SAT + Number of satellites used for determination of the position. Needs + interger conversion. + + example: GPS_SAT,"","%d" + + o GPS_FIX + Type of fix (see GPX spec). Needs string conversion. + + example: GPS_FIX,"","%s" + EXAMPLES: -------- For examples on using the XCSV module, please see the *.style files in diff --git a/style/fugawi.style b/style/fugawi.style index 9a03c35fa..e47b38966 100644 --- a/style/fugawi.style +++ b/style/fugawi.style @@ -1,8 +1,8 @@ # fugawi XCSV style file # # Format: Fugawi -# Author: Robert Lipe -# Date: 03/10/2003 +# Author: Robert Lipe, Patrick Ohly +# Date: 07/24/2005 # # @@ -26,7 +26,7 @@ PROLOGUE \# Waypoint comment PROLOGUE \# Waypoint description PROLOGUE \# Latitude in Degree and decimals (soutern hemisphere has neg. degrees) PROLOGUE \# Longitude in degree and decimals (neg. numbers: west of Greenwich) -PROLOGUE \# Height in meters +PROLOGUE \# Height in meters [optional when importing, always present when exporting: Date (GMT) as ISO YYYYMMDD, Time of the day relative to the date as HHMMSS # # INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE: @@ -37,3 +37,5 @@ IFIELD NOTES, "", "%s" IFIELD LAT_DECIMAL, "", "%-.7f" IFIELD LON_DECIMAL, "", "%-.7f" IFIELD ALT_METERS, "", "%-7.1f" +IFIELD GMT_TIME, "", "%Y%m%d" +IFIELD HMSG_TIME, "", "%02d%02d%02d" diff --git a/style/gpsdrivetrack.style b/style/gpsdrivetrack.style new file mode 100644 index 000000000..e7a47ffcd --- /dev/null +++ b/style/gpsdrivetrack.style @@ -0,0 +1,27 @@ +# gpsbabel XCSV style file +# +# Format: GPSDriveTrack +# Author: Tobias Minich +# Date: 12/07/2005 +# +# +# + +DESCRIPTION GpsDrive Format for Tracks + +# FILE LAYOUT DEFINITIIONS: +# +FIELD_DELIMITER WHITESPACE +RECORD_DELIMITER NEWLINE +BADCHARS ,'" + +SHORTLEN 20 +SHORTWHITE 0 + +# +# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE: + +OFIELD LAT_DECIMAL, "", "%10.6f" +OFIELD LON_DECIMAL, "", "%10.6f" +OFIELD ALT_METERS, "", "%10.0f" +OFIELD GMT_TIME, "", "%a %b %d %T %Y" diff --git a/style/openoffice.style b/style/openoffice.style new file mode 100644 index 000000000..ea42b7f9d --- /dev/null +++ b/style/openoffice.style @@ -0,0 +1,47 @@ +# gpsbabel XCSV style file +# +# Format: Tab delimitered csv useful for OpenOffice, Ploticus etc. +# Author: Tobias Minich +# Date: 07/18/2005 +# +# + +DESCRIPTION Tab delimitered csv useful for OpenOffice, Ploticus etc. + +# FILE LAYOUT DEFINITIIONS: +# +FIELD_DELIMITER TAB +RECORD_DELIMITER NEWLINE +BADCHARS TAB + +# +# HEADER STUFF: +# +PROLOGUE Index Lat Lon Icon Name Description Notes URL Link Text Altitude (m) Distance (km) Speed (m/s) Course (°) Time HDOP VDOP PDOP Satellites Fix + +# +# INDIVIDUAL DATA FIELDS: +# +IFIELD INDEX, "", "%d" +IFIELD LAT_DECIMAL, "", "%f" +IFIELD LAT_DIR, "", "%c" +IFIELD LAT_HUMAN_READABLE, "", "%d° %f' %c" +IFIELD LON_DECIMAL, "", "%f" +IFIELD LON_DIR, "", "%c" +IFIELD LON_HUMAN_READABLE, "", "%d° %f' %c" +IFIELD ICON_DESCR, "", "%s" +IFIELD SHORTNAME, "", "%s" +IFIELD DESCRIPTION, "", "%s" +IFIELD NOTES, "", "%s" +IFIELD URL, "", "%s" +IFIELD URL_LINK_TEXT, "", "%s" +IFIELD ALT_METERS, "", "%f" +IFIELD PATH_DISTANCE_KM, "", "%f" +IFIELD PATH_SPEED, "", "%f" +IFIELD PATH_COURSE, "", "%f" +IFIELD EXCEL_TIME, "", "%f" +IFIELD GPS_HDOP, "", "%f" +IFIELD GPS_VDOP, "", "%f" +IFIELD GPS_PDOP, "", "%f" +IFIELD GPS_SAT, "", "%d" +IFIELD GPS_FIX, "", "%s" diff --git a/style/s_and_t.style b/style/s_and_t.style index 391a96774..a9c685dd5 100644 --- a/style/s_and_t.style +++ b/style/s_and_t.style @@ -13,6 +13,8 @@ # DESCRIPTION Microsoft Streets and Trips 2002-2005 +EXTENSION txt + # # FILE LAYOUT DEFINITIIONS: diff --git a/tef_xml.c b/tef_xml.c index a5e2ac624..85308dbb4 100644 --- a/tef_xml.c +++ b/tef_xml.c @@ -116,11 +116,11 @@ tef_header(const char *args, const char **attrv) { if (strcmp(avp[0], "Name") == 0) { - route->rte_name = str_utf8_to_cp1252(avp[1]); + route->rte_name = xstrdup(avp[1]); } else if (strcmp(avp[0], "Software") == 0) { - route->rte_desc = str_utf8_to_cp1252(avp[1]); + route->rte_desc = xstrdup(avp[1]); } avp+=2; } @@ -218,11 +218,11 @@ tef_item_start(const char *args, const char **attrv) { if (0 == strcmp(avp[0], "PointDescription")) { - wpt_tmp->shortname = str_utf8_to_cp1252(avp[1]); + wpt_tmp->shortname = xstrdup(avp[1]); } if (0 == strcmp(avp[0], "SegDescription")) { - wpt_tmp->description = str_utf8_to_cp1252(avp[1]); + wpt_tmp->description = xstrdup(avp[1]); } if ((0 == strcmp(avp[0], "ViaStation")) && (0 == strcmp(avp[1], "true"))) { @@ -269,7 +269,7 @@ tef_point(const char *args, const char **attrv) static void tef_xml_rd_init(const char *fname) { - xml_init(fname, tef_xml_map); + xml_init(fname, tef_xml_map, NULL); } /* diff --git a/testc b/testc new file mode 100644 index 000000000..38093cbd2 --- /dev/null +++ b/testc @@ -0,0 +1,56 @@ +#!/bin/bash + +# +# try to read and write all combinations we can. Don't try to +# be terribly portable and don't test for correctness. This test +# is meant for code coverage. +# + +# Exercise read and write of waypoint/track/route in every format. + +TMPD=/tmp/babeltest.$$ +GB="./gpsbabel" + +mkdir $TMPD + +rwall() { + name=$1 + cap=$2 + + REFFILE=reference/expertgps.gpx + + if [ $(echo $cap | grep -s w) ]; then + $GB -i gpx -f $REFFILE -o $name -F $TMPD/$name + if [ $(echo $cap | grep -s r) ]; then + $GB -i $name -f $TMPD/$name -o gpx -F /dev/null + fi + fi +} + +# +# Given a Geocache as input, verify we can write it. +# +wgc() { + name=$1 + cap=$2 + + REFDIR=reference/gc + if [ $(echo $cap | grep -s '^.w') ]; then + $GB -i gpx -f $REFDIR/GC7FA4.gpx -o $name -F $TMPD/$name-gc1 + $GB -i gpx -f $REFDIR/GCGCA8.gpx -o $name -F $TMPD/$name-gc2 + fi +} + + +$GB -^2 | while read fmt cap name junk +do + if [ "$fmt" != "file" ]; then + continue; + fi + + rwall $name $cap + wgc $name $cap + + echo $name + +done diff --git a/testo b/testo index 7b931e87b..19832b75f 100644 --- a/testo +++ b/testo @@ -86,12 +86,21 @@ compare ${TMPDIR}/tiger ${TMPDIR}/tiger2 # awkward to test. # rm -f ${TMPDIR}/lowrance1.usr +rm -f ${TMPDIR}/enchilada1.usr +rm -f ${TMPDIR}/enchilada.gpx ${PNAME} -i geo -f geocaching.loc -o lowranceusr -F ${TMPDIR}/lowrance1.usr bincompare ${TMPDIR}/lowrance1.usr reference/lowrance.usr ${PNAME} -i lowranceusr -f ${TMPDIR}/lowrance1.usr -o lowranceusr -F ${TMPDIR}/lowrance1.usr # And because of the FP rounding, we can't even read our file, write it back # and get the same data. Sigh. # bincompare reference/lowrance.usr ${TMPDIR}/lowrance1.usr +${PNAME} -i lowranceusr -f reference/all.usr -o gpx -F ${TMPDIR}/enchilada.gpx +${PNAME} -i gpx -f ${TMPDIR}/enchilada.gpx -o lowranceusr -F ${TMPDIR}/enchilada1.usr +bincompare ${TMPDIR}/enchilada1.usr reference/enchilada.usr +# Don't convert icons as waypts +${PNAME} -i lowranceusr,ignoreicons -f reference/all.usr -o gpx -F ${TMPDIR}/enchilada.gpx +${PNAME} -i gpx -f ${TMPDIR}/enchilada.gpx -o lowranceusr -F ${TMPDIR}/enchilada1.usr +bincompare ${TMPDIR}/enchilada1.usr reference/ignoreicons.usr # CSV (Comma separated value) data. @@ -688,13 +697,11 @@ ${PNAME} -i geo -f geocaching.loc -o geo -F ${TMPDIR}/geocustom.out ${PNAME} -i geo -f geocaching.loc -o text -F ${TMPDIR}/text.out -o html -F ${TMPDIR}/html.out -o vcard -F ${TMPDIR}/vcard.out #-o palmdoc -F ${TMPDIR}/pd.out # -# TourExchangeFormat tef (read only) +# tef "TourExchangeFormat" read test # rm -f ${TMPDIR}/tef_xml* ${PNAME} -r -i tef -f reference/route/tef_xml.sample.xml -o gpx -F ${TMPDIR}/tef_xml.sample.gpx -grep -v "Yes" + } else if (sname == "s_and_t") { + printf "[1][2]" + } + print "" + + + for (i = 1; i <= 6; i++) { + c = substr(cap, i, 1) + printf "" + if (c != ("-")) printf "yes" + printf "\n" + } + print "" +} +getcap($1, $2, $3, $5) +' > ../babelweb/capabilities.inc > ../babelweb/capabilities.inc diff --git a/tools/mkchanges b/tools/mkchanges index 5df969a82..3ef2c933c 100644 --- a/tools/mkchanges +++ b/tools/mkchanges @@ -6,7 +6,7 @@ cvsps $* | awk ' split($0, dte, " "); printf "\n%s", dte[2]; - printf "
" + printf "" } /^Log:/ { gsub("^Log:", ""); inlog = 1 } /^Members:/ {printf "%s", logt ; inlog = 0; } diff --git a/tpg.c b/tpg.c index c30dec255..b0ecaba80 100644 --- a/tpg.c +++ b/tpg.c @@ -185,7 +185,8 @@ tpg_read(void) stringsize = buff[0]; - tpg_fread(&buff[0], stringsize, 1, tpg_file_in); + if (stringsize) + tpg_fread(&buff[0], stringsize, 1, tpg_file_in); buff[stringsize] = '\0'; wpt_tmp->description = xstrdup(buff); diff --git a/trackfilter.c b/trackfilter.c new file mode 100644 index 000000000..acd1bb43b --- /dev/null +++ b/trackfilter.c @@ -0,0 +1,763 @@ +/* + + Track manipulation filter + + Copyright (C) 2005 Olaf Klein, o.b.klein@t-online.de + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + + /* + 2005-07-20: implemented interval option from Etienne Tasse + 2005-07-26: implemented range option + 2005-07-26: implemented move option + 2005-07-26: implemented merge option + 2005-07-29: warning fixes + */ + +#include +#include +#include +#include "defs.h" +#include "strptime.h" + +#define MYNAME "trackfilter" + +#define TRACKFILTER_PACK_OPTION "pack" +#define TRACKFILTER_SPLIT_OPTION "split" +#define TRACKFILTER_TITLE_OPTION "title" +#define TRACKFILTER_MERGE_OPTION "merge" +#define TRACKFILTER_STOP_OPTION "stop" +#define TRACKFILTER_START_OPTION "start" +#define TRACKFILTER_MOVE_OPTION "move" + +#undef TRACKF_DBG + +static char *opt_merge = NULL; +static char *opt_pack = NULL; +static char *opt_split = NULL; +static char *opt_move = NULL; +static char *opt_title = NULL; +static char *opt_start = NULL; +static char *opt_stop = NULL; + +static +arglist_t trackfilter_args[] = { + {TRACKFILTER_MOVE_OPTION, &opt_move, + "Correct trackpoint timestamps by a delta", NULL, ARGTYPE_STRING}, + {TRACKFILTER_PACK_OPTION, &opt_pack, + "Pack all tracks into one", NULL, ARGTYPE_BOOL}, + {TRACKFILTER_SPLIT_OPTION, &opt_split, + "Split track by date or by time interval (see README)", NULL, ARGTYPE_STRING}, + {TRACKFILTER_MERGE_OPTION, &opt_merge, + "Merge multiple tracks for the same way", NULL, ARGTYPE_STRING}, + {TRACKFILTER_START_OPTION, &opt_start, + "Use only track points after this timestamp", NULL, ARGTYPE_INT}, + {TRACKFILTER_STOP_OPTION, &opt_stop, + "Use only track points before this timestamp", NULL, ARGTYPE_INT}, + {TRACKFILTER_TITLE_OPTION, &opt_title, + "Basic title for new track(s)", NULL, ARGTYPE_STRING}, + {0, 0, 0, 0, 0} +}; + + +typedef struct trkflt_s +{ + route_head *track; + time_t first_time; + time_t last_time; +} trkflt_t; + +static trkflt_t *track_list = NULL; +static int track_ct = 0; +static int track_pts = 0; +static int opt_interval = 0; + +/******************************************************************************* +* dummy callbacks for track_disp_all +*******************************************************************************/ + +static void +trackfilter_noop_w(const waypoint *w) +{ +} + +static void +trackfilter_noop_t(const route_head *h) +{ +} + +/******************************************************************************* +* helpers +*******************************************************************************/ + +static int +trackfilter_opt_count(void) +{ + int res = 0; + arglist_t *a = trackfilter_args; + + while (a->argstring) + { + if (*a->argval != NULL) res++; + a++; + } + return res; +} + +static int +trackfilter_parse_time_opt(const char *arg) +{ + time_t t0, t1; + int sign = 1; + char *cin = (char *)arg; + char c; + + t0 = t1 = 0; + + while ((c = *cin++)) + { + time_t seconds; + + if (c >= '0' && c <= '9') + { + t1 = (t1 * 10) + (c - '0'); + continue; + } + switch(tolower(c)) + { + case 'd': seconds = (24 * 60 * 60); break; + case 'h': seconds = (60 * 60); break; + case 'm': seconds = 60; break; + case 's': seconds = 1; break; + case '+': sign = +1; continue; + case '-': sign = -1; continue; + default: fatal(MYNAME "-time: invalid character in time option!\n"); + } + t0 += (t1 * seconds); + t1 = 0; + } + t0 += t1; + return t0 * sign; +} + +static int +trackfilter_init_qsort_cb(const void *a, const void *b) +{ + const trkflt_t *ra = a; + const trkflt_t *rb = b; + + return ra->first_time - rb->first_time; +} + +static int +trackfilter_merge_qsort_cb(const void *a, const void *b) +{ + const waypoint *wa = *(waypoint **)a; + const waypoint *wb = *(waypoint **)b; + + return wa->creation_time - wb->creation_time; +} + +static void +trackfilter_fill_track_list_cb(const route_head *track) /* callback for track_disp_all */ +{ + int i; + waypoint *wpt, *prev; + queue *elem, *tmp; + + if (track->rte_waypt_ct == 0) + { + track_del_head((route_head *)track); + return; + } + + track_list[track_ct].track = (route_head *)track; + + i = 0; + prev = NULL; + + QUEUE_FOR_EACH((queue *)&track->waypoint_list, elem, tmp) + { + track_pts++; + + wpt = (waypoint *)elem; + if (wpt->creation_time == 0) + fatal(MYNAME "-init: Found track point without time!\n"); + + i++; + if (i == 1) + track_list[track_ct].first_time = wpt->creation_time; + else + if (i == track->rte_waypt_ct) + track_list[track_ct].last_time = wpt->creation_time; + + if ((prev != NULL) && (prev->creation_time > wpt->creation_time)) + { + if (opt_merge == NULL) + fatal(MYNAME "-init: Track points badly ordered (timestamp)!\n"); + } + prev = wpt; + } + track_ct++; +} + +/******************************************************************************* +* track title producers +*******************************************************************************/ + +static void +trackfilter_split_init_rte_name(route_head *track, const time_t time) +{ + char buff[128], tbuff[128]; + struct tm tm; + + tm = *localtime(&time); + + (opt_interval != 0) ? + strftime(tbuff, sizeof(tbuff), "%Y%m%d%H%M%S", &tm) : + strftime(tbuff, sizeof(tbuff), "%Y%m%d", &tm); + + if ((opt_title != NULL) && (strlen(opt_title) > 0)) + { + if (strchr(opt_title, '%') != NULL) { + strftime(buff, sizeof(buff), opt_title, &tm); + } + else { + snprintf(buff, sizeof(buff), "%s-%s", opt_title, tbuff); + } + } + else if ((track->rte_name != NULL ) && (strlen(track->rte_name) > 0)) + { + snprintf(buff, sizeof(buff), "%s-%s", track->rte_name, tbuff); + } + else { + strncpy(buff, tbuff, sizeof(buff)); + } + + if (track->rte_name != NULL) { + xfree(track->rte_name); + } + track->rte_name = xstrdup(buff); +} + +static void +trackfilter_pack_init_rte_name(route_head *track, const time_t default_time) +{ + char buff[128]; + + if (strchr(opt_title, '%') != NULL) + { + struct tm tm; + waypoint *wpt; + + if (track->rte_waypt_ct == 0) + { + tm = *localtime(&default_time); + } + else + { + wpt = (waypoint *) QUEUE_FIRST((queue *)&track->waypoint_list); + tm = *localtime(&wpt->creation_time); + } + strftime(buff, sizeof(buff), opt_title, &tm); + } + else + strncpy(buff, opt_title, sizeof(buff)); + + if (track->rte_name != NULL) + xfree(track->rte_name); + track->rte_name = xstrdup(buff); +} + +/******************************************************************************* +* option "title" +*******************************************************************************/ + +static void +trackfilter_title(void) +{ + int i; + + if (opt_title == NULL) return; + + if (strlen(opt_title) == 0) { + fatal(MYNAME "-title: Missing your title!\n"); + } + for (i = 0; i < track_ct; i++) + { + route_head *track = track_list[i].track; + trackfilter_pack_init_rte_name(track, 0); + } +} + +/******************************************************************************* +* option "pack" (default) +*******************************************************************************/ + +static void +trackfilter_pack(void) +{ + int i, j; + trkflt_t prev; + route_head *master; + + for (i = 1, j = 0; i < track_ct; i++, j++) + { + prev = track_list[j]; + if (prev.last_time >= track_list[i].first_time) + fatal(MYNAME "-pack: Tracks overlap in time!\n"); + } + + /* we fill up the first track by all other track points */ + + master = track_list[0].track; + + for (i = 1; i < track_ct; i++) + { + queue *elem, *tmp; + route_head *curr = track_list[i].track; + + QUEUE_FOR_EACH((queue *)&curr->waypoint_list, elem, tmp) + { + waypoint *wpt = (waypoint *)elem; + route_add_wpt(master, waypt_dupe(wpt)); + } + track_del_head(curr); + track_list[i].track = NULL; + } + track_ct = 1; +} + +/******************************************************************************* +* option "merge" +*******************************************************************************/ + +static void +trackfilter_merge(void) +{ + int i, j, dropped; + + queue *elem, *tmp; + waypoint **buff; + waypoint *prev, *wpt; + route_head *master = track_list[0].track; + + if (track_pts < 1) return; + + buff = xcalloc(track_pts, sizeof(*buff)); + + j = 0; + for (i = 0; i < track_ct; i++) /* put all points into temp buffer */ + { + route_head *track = track_list[i].track; + QUEUE_FOR_EACH((queue *)&track->waypoint_list, elem, tmp) + { + wpt = (waypoint *)elem; + buff[j++] = waypt_dupe(wpt); + route_del_wpt(track, wpt); + } + if (track != master) /* i > 0 */ + track_del_head(track); + } + track_ct = 1; + + qsort(buff, track_pts, sizeof(*buff), trackfilter_merge_qsort_cb); + + dropped = 0; + prev = NULL; + + for (i = 0; i < track_pts; i++) + { + wpt = buff[i]; + if ((prev == NULL) || (prev->creation_time != wpt->creation_time)) + { + route_add_wpt(master, wpt); + prev = wpt; + } + else + { + waypt_free(wpt); + dropped++; + } + } + xfree(buff); + + if (global_opts.verbose_status > 0) + printf(MYNAME "-merge: %d track point(s) merged, %d dropped.\n", track_pts - dropped, dropped); +} + +/******************************************************************************* +* option "split" +*******************************************************************************/ + +static void +trackfilter_split(void) +{ + route_head *curr; + route_head *master = track_list[0].track; + int count = master->rte_waypt_ct; + + waypoint **buff; + waypoint *wpt; + queue *elem, *tmp; + int i, j; + float interval = -1; + + if (count <= 1) return; + + /* check additional options */ + + opt_interval = (0 != strcmp(opt_split, TRACKFILTER_SPLIT_OPTION)); + + if (opt_interval != 0) + { + float base; + char dhms; + + switch(strlen(opt_split)) + { + case 0: + fatal(MYNAME ": No time interval specified.\n"); + break; /* ? */ + + case 1: + dhms = *opt_split; + interval = 1; + break; + + default: + i = sscanf(opt_split,"%f%c", &interval, &dhms); + if (i == 0) + { + /* test reverse order */ + i = sscanf(opt_split,"%c%f", &dhms, &interval); + } + if ((i != 2) || (interval <= 0)) + { + fatal(MYNAME ": invalid time interval specified, must be one a positive number.\n"); + } + break; + } + + switch(tolower(dhms)) + { + case 's': + base = 1; + break; + case 'm': + base = 60; + break; + case 'h': + base = 60 * 60; + break; + case 'd': + base = 24 * 60 * 60; + break; + default: + fatal(MYNAME ": invalid time interval specified, must be one of [dhms].\n"); + break; + } +#ifdef TRACKF_DBG + printf(MYNAME ": dhms \"%c\", interval %g -> %g\n", dhms, interval, base * interval); +#endif + interval *= base; + } + + trackfilter_split_init_rte_name(master, track_list[0].first_time); + + buff = (waypoint **) xcalloc(count, sizeof(*buff)); + + i = 0; + QUEUE_FOR_EACH((queue *)&master->waypoint_list, elem, tmp) + { + wpt = (waypoint *)elem; + buff[i++] = wpt; + } + + curr = NULL; /* will be set by first new track */ + + for (i=0, j=1; jcreation_time); + t2 = *localtime(&buff[j]->creation_time); + + new_track_flag = ((t1.tm_year != t2.tm_year) || (t1.tm_mon != t2.tm_mon) || + (t1.tm_mday != t2.tm_mday)); +#ifdef TRACKF_DBG + if (new_track_flag != 0) + printf(MYNAME ": new day %02d.%02d.%04d\n", t2.tm_mday, t2.tm_mon+1, t2.tm_year+1900); +#endif + } + else + { + float tr_interval; + + tr_interval = difftime(buff[j]->creation_time,buff[i]->creation_time); + new_track_flag = ( tr_interval > interval ); +#ifdef TRACKF_DBG + if (new_track_flag != 0) + printf(MYNAME ": split, %g > %g\n", tr_interval, interval ); +#endif + } + if (new_track_flag != 0) + { + curr = (route_head *) route_head_alloc(); + trackfilter_split_init_rte_name(curr, buff[j]->creation_time); + track_add_head(curr); + } + if (curr != NULL) + { + wpt = waypt_dupe(buff[j]); + route_del_wpt(master, buff[j]); + route_add_wpt(curr, wpt); + buff[j] = wpt; + } + } + xfree(buff); +} + +/******************************************************************************* +* option "move" +*******************************************************************************/ + +static void +trackfilter_move(void) +{ + int i; + queue *elem, *tmp; + waypoint *wpt; + time_t delta; + + delta = trackfilter_parse_time_opt(opt_move); + if (delta == 0) return; + + for (i = 0; i < track_ct; i++) + { + route_head *track = track_list[i].track; + QUEUE_FOR_EACH((queue *)&track->waypoint_list, elem, tmp) + { + wpt = (waypoint *)elem; + wpt->creation_time += delta; + } + track_list[i].first_time += delta; + track_list[i].last_time += delta; + } +} + +/******************************************************************************* +* option: "start" / "stop" +*******************************************************************************/ + +static time_t +trackfilter_range_check(const char *timestr) +{ + int i; + char fmt[20]; + char c; + char *cin; + struct tm time; + + + i = 0; + strncpy(fmt, "00000101000000", sizeof(fmt)); + cin = (char *)timestr; + + while ((c = *cin++)) + { + if (fmt[i] == '\0') fatal(MYNAME "-range: parameter too long \"%s\"!\n", timestr); + if (isdigit(c) == 0) fatal(MYNAME "-range: invalid character \"%c\"!\n", c); + fmt[i++] = c; + } + cin = strptime(fmt, "%Y%m%d%H%M%S", &time); + if ((cin != NULL) && (*cin != '\0')) + fatal(MYNAME "-range-check: Invalid time stamp (stopped at %s of %s)!\n", cin, fmt); + + return mkgmtime(&time); +} + +static int +trackfilter_range(void) /* returns number of track points left after filtering */ +{ + time_t start, stop; + queue *elem, *tmp; + int i, dropped; + + if (opt_start != 0) + start = trackfilter_range_check(opt_start); + else + start = 0; + + if (opt_stop != 0) + stop = trackfilter_range_check(opt_stop); + else + stop = (unsigned long)-1; + + dropped = 0; + + for (i = 0; i < track_ct; i++) + { + route_head *track = track_list[i].track; + + QUEUE_FOR_EACH((queue *)&track->waypoint_list, elem, tmp) + { + waypoint *wpt = (waypoint *)elem; + + if ((wpt->creation_time < start) || (wpt->creation_time > stop)) + { + route_del_wpt(track, wpt); + dropped++; + } + } + + if (track->rte_waypt_ct == 0) + { + track_del_head(track); + track_list[i].track = NULL; + } + } + + if ((track_pts > 0) && (dropped == track_pts)) + warning(MYNAME "-range: All %d track points have been dropped!\n", track_pts); + + return track_pts - dropped; +} + +/******************************************************************************* +* global cb's +*******************************************************************************/ + +static void +trackfilter_init(const char *args) +{ + + int count = track_count(); + + track_ct = 0; + track_pts = 0; + + if (count > 0) + { + track_list = (trkflt_t *) xcalloc(count, sizeof(*track_list)); + + /* check all tracks for time and order (except merging) */ + + track_disp_all(trackfilter_fill_track_list_cb, trackfilter_noop_t, trackfilter_noop_w); + qsort(track_list, track_ct, sizeof(*track_list), trackfilter_init_qsort_cb); + } +} + +static void +trackfilter_deinit(void) +{ + if (track_list != NULL) + { + xfree(track_list); + track_list = NULL; + } + track_ct = 0; + track_pts = 0; +} + +/******************************************************************************* +* trackfilter_process: called from gpsbabel central engine +*******************************************************************************/ + +static void +trackfilter_process(void) +{ + int opts, something_done; + + if (track_ct == 0) return; /* no track(s), no fun */ + + opts = trackfilter_opt_count(); + if (opts == 0) opts = -1; /* flag for do "pack" by default */ + + if (opt_move != NULL) /* Correct timestamps before any other op */ + { + trackfilter_move(); + if (--opts == 0) return; + } + + if ((opt_stop != NULL) || (opt_start != NULL)) + { + if (opt_start != NULL) opts--; + if (opt_stop != NULL) opts--; + + trackfilter_range(); + + if (opts == 0) return; + + trackfilter_deinit(); /* reinitialize */ + trackfilter_init(NULL); + + } + + if (opt_title != NULL) + { + if (--opts == 0) + { + trackfilter_title(); + return; + } + } + + something_done = 0; + + if ((opt_pack != NULL) || (opts == -1)) /* call our default option */ + { + trackfilter_pack(); + something_done = 1; + } + else if (opt_merge != NULL) + { + trackfilter_merge(); + something_done = 1; + } + + if ((something_done == 1) && (--opts <= 0)) + { + if (opt_title != NULL) + trackfilter_title(); + return; + } + + if (opt_split != NULL) + { + if (track_ct > 1) + fatal(MYNAME "-split: Cannot split more than one track, please pack (or merge) before!\n"); + + trackfilter_split(); + } +} + +/******************************************************************************************/ + +filter_vecs_t trackfilter_vecs = { + trackfilter_init, + trackfilter_process, + trackfilter_deinit, + NULL, + trackfilter_args +}; + +/******************************************************************************************/ diff --git a/util.c b/util.c index 4ce40cf4f..654eeefbc 100644 --- a/util.c +++ b/util.c @@ -477,6 +477,7 @@ si_round( double d ) /* * Return a time_t suitable for adding to a time_t that is in GMT to * make it a local time. + * Obsolete: to use mkgmtime instead. */ signed int get_tz_offset(void) @@ -491,6 +492,54 @@ get_tz_offset(void) } } +/* + mkgmtime -- convert tm struct in UTC to time_t + + works just like mktime but without all the mucking + around with timezones and daylight savings + + obsoletes get_tz_offset() + + Borrowed from lynx GPL source code + http://lynx.isc.org/release/lynx2-8-5/src/mktime.c + + Written by Philippe De Muyter . +*/ + +time_t +mkgmtime(struct tm *t) +{ + short month, year; + time_t result; + static int m_to_d[12] = + {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; + + month = t->tm_mon; + year = t->tm_year + month / 12 + 1900; + month %= 12; + if (month < 0) + { + year -= 1; + month += 12; + } + result = (year - 1970) * 365 + m_to_d[month]; + if (month <= 1) + year -= 1; + result += (year - 1968) / 4; + result -= (year - 1900) / 100; + result += (year - 1600) / 400; + result += t->tm_mday; + result -= 1; + result *= 24; + result += t->tm_hour; + result *= 60; + result += t->tm_min; + result *= 60; + result += t->tm_sec; + return(result); +} + + /* * A wrapper for time(2) that allows us to "freeze" time for testing. */ @@ -805,7 +854,7 @@ char * str_utf8_to_cp1252( const char * str ) } } *cur = (char)value; - strcpy( cur+1, cur+bytes ); + memmove(cur+1, cur+bytes, strlen(cur+bytes) + 1); } cur++; } @@ -895,7 +944,7 @@ char * str_utf8_to_ascii( const char * str ) cur += bytes - 1; } else { *cur = (char)value; - memmove(cur+1, cur+bytes, bytes+1); + memmove(cur+1, cur+bytes, strlen(cur+bytes)); } } cur++; @@ -903,6 +952,48 @@ char * str_utf8_to_ascii( const char * str ) return result; } +/* + * str_iso8859_1_to_utf8 + * + * converts the single byte charset ISO8859-1 (latin1) to UTF-8 + */ + +char * +str_iso8859_1_to_utf8(const char *s) +{ + int len; + char *res; + unsigned char c; + char *src, *dst; + + if (s == NULL) return NULL; + + len = 0; + src = (char *)s; + while ('\0' != (c = *src++)) + { + len++; + if (c & 0x80) len++; + } + + src = (char *)s; + dst = res = (void *) xmalloc(len + 1); + while ('\0' != (c = *src++)) + { + if (c & 0x80) + { + *dst++ = (0xc0 | (c >> 6)); + *dst++ = (c & 0xbf); + } + else + { + *dst++ = c; + } + } + *dst = '\0'; + return res; +} + /* * Get rid of potentially nasty HTML that would influence another record * that includes; diff --git a/uuid.c b/uuid.c index 97b631476..f7e568ca3 100644 --- a/uuid.c +++ b/uuid.c @@ -23,7 +23,7 @@ void uuid_generate(uuid_t uu) { - char *cp; + unsigned char *cp; int i; for (cp = uu, i = 0; i < 16; i++) { if (getenv("GPSBABEL_FREEZE_TIME")) { diff --git a/vecs.c b/vecs.c index f524990c9..a1656ee71 100644 --- a/vecs.c +++ b/vecs.c @@ -82,6 +82,10 @@ extern ff_vecs_t an1_vecs; extern ff_vecs_t tomtom_vecs; extern ff_vecs_t tef_xml_vecs; extern ff_vecs_t ppdb_vecs; +extern ff_vecs_t vitosmt_vecs; +extern ff_vecs_t gdb_vecs; +extern ff_vecs_t bcr_vecs; +extern ff_vecs_t coto_vecs; static vecs_t vec_list[] = { @@ -137,8 +141,8 @@ vecs_t vec_list[] = { { &mps_vecs, "mapsource", - "Garmin Mapsource", - NULL + "Garmin Mapsource - mps", + "mps" }, { &gpsutil_vecs, @@ -179,13 +183,13 @@ vecs_t vec_list[] = { { &magnav_vec, "magnav", - "Magellan NAV Companion for PalmOS", + "Magellan NAV Companion for Palm/OS", NULL }, { &garmin_vecs, "garmin", - "Garmin serial protocol", + "Garmin serial/USB protocol", NULL }, { @@ -221,8 +225,8 @@ vecs_t vec_list[] = { { &easygps_vecs, "easygps", - "EasyGPS", - NULL + "EasyGPS binary format", + ".loc" }, { &quovadis_vecs, @@ -395,9 +399,35 @@ vecs_t vec_list[] = { { &ppdb_vecs, "pathaway", - "PathAway Palm Database", + "PathAway Database for Palm/OS", "pdb" }, + { + &vitosmt_vecs, + "vitosmt", + "Vito Navigator II tracks", + "smt" + }, + { + &gdb_vecs, + "gdb", + "Garmin Mapsource - gdb", + "gdb" + }, + { + &bcr_vecs, + "bcr", + "Motorrad Routenplaner (Map&Guide) .bcr files", + "bcr" + }, +#if 0 + { + &coto_vecs, + "coto", + "cotoGPS for Palm/OS", + NULL + }, +#endif { NULL, NULL, @@ -588,7 +618,7 @@ alpha (const void *a, const void *b) const vecs_t *const *ap = a; const vecs_t *const *bp = b; - return strcasecmp((*ap)->desc , (*bp)->desc); + return case_ignore_strcmp((*ap)->desc , (*bp)->desc); } /* @@ -623,6 +653,7 @@ sort_and_unify_vecs(int *ctp) svp[i] = xcalloc(1, sizeof **svp); svp[i]->name = svec->name; svp[i]->vec = xmalloc(sizeof(*svp[i]->vec)); + svp[i]->extension = xcsv_file.extension; *svp[i]->vec = *vec_list[0].vec; /* Interits xcsv opts */ /* Reset file type to inherit ff_type from xcsv for everything * except the xcsv format itself, which we leave as "internal" @@ -705,7 +736,6 @@ disp_formats(int version) { vecs_t **svp; vecs_t *vec; - style_vecs_t *svec; int i, vc = 0; switch(version) { @@ -732,9 +762,9 @@ disp_formats(int version) vec->extension? vec->extension : "", vec->desc); } + xfree (svp); break; default: ; } - xfree (svp); } diff --git a/vitosmt.c b/vitosmt.c new file mode 100644 index 000000000..f7e1ad555 --- /dev/null +++ b/vitosmt.c @@ -0,0 +1,413 @@ +/* + Read Vito Navigator .SMT tracks + + Copyright (C) 2005 Etienne TASSE + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#include +#include +#include +#include + +#define MYNAME "vitosmt" +#include "defs.h" + +static FILE *infile =0; +static FILE *ofs =0; +static long count =0; + +const long vitosmt_version =2; +const long vitosmt_subversion =1000; +const size_t vitosmt_headersize =24; +const size_t vitosmt_datasize =64; +const double mile2km =1.609344; /* mile/h to kilometer/h */ +const double kts2mps =0.5144444444444444444; /* knots to m/s */ +const double mph2mps =0.447039259; /* mile/h to m/s */ + +static unsigned long +ReadLong(FILE * f) +{ + gbuint32 result = 0; + + fread(&result, sizeof (result), 1, f); + return le_read32(&result); +} + +static double +ReadDouble(FILE * f) +{ + unsigned char buffer[8] = "\0\0\0\0\0\0\0\0"; + double result=0; + + fread(buffer, sizeof (buffer), 1, f); + le_read64(&result,buffer); + return result; +} + + +static unsigned char * +ReadRecord(FILE * f, + size_t size) +{ + unsigned char *result = (unsigned char *) xmalloc(size); + + fread(result, size, 1, f); + return result; +} + +static void +WriteDouble(void* ptr, double d) +{ + unsigned char result[8]="\0\0\0\0\0\0\0\0"; + + le_read64(result, &d); + memcpy(ptr, result, 8); + + return; +} + + +static void +rd_init(const char *fname) +{ + infile = xfopen(fname, "rb", MYNAME); +} + +static void +rd_deinit(void) +{ + fclose(infile); +} + +static void +vitosmt_read(void) +{ + long version =0; + long subversion =0; + long check1 =-1; + long check2 =-2; + long check3 =-3; + route_head *route_head =0; + waypoint *wpt_tmp =0; + double latrad =0; + double lonrad =0; + double elev =0; + unsigned char* timestamp =0; + struct tm tmStruct ={0,0,0,0,0,0,0,0,0}; + double seconds =0.0; + double speed =0.0; + double course =0.0; + double pdop =0.0; + unsigned char gpsfix =0; + unsigned char gpsvalid =0; + unsigned char gpssats =0; + int serial =0; + + + /* + * 24 bytes header + */ + version = ReadLong(infile); /* 2 */ + subversion = ReadLong(infile); /* 1000 */ + count = ReadLong(infile); /* n */ + check1 = ReadLong(infile); /* 0 */ + check2 = ReadLong(infile); /* not sure */ + check3 = ReadLong(infile); /* n */ + + if (version!=vitosmt_version) { + + fatal("%s (%d) reading file. Unsupported version %ld.%ld\n", + MYNAME, __LINE__, version, subversion ); + } + + if (subversion!=vitosmt_subversion) { + warning("%s (%d) reading file. Unsafe version %ld.%ld\n", + MYNAME, __LINE__, version, subversion ); + } + + if ((count!=check3) || + (check1!=count-1) || + (check3!=count) ) { + + fatal("%s (%d) reading file. Invalid file header\n", + MYNAME, __LINE__ ); + + } + + while (count) { + /* + * 64 bytes of data + */ + if (feof(infile)||ferror(infile)) + { + warning("%s (%d) reading file. Unexpected end of file %s\n", + MYNAME, __LINE__, strerror(errno) ); + break; + } + + latrad =ReadDouble(infile); /* WGS84 latitude in radians */ + lonrad =ReadDouble(infile); /* WGS84 longitude in radians */ + elev =ReadDouble(infile); /* elevation in meters */ + timestamp =ReadRecord(infile,5); /* UTC time yr/mo/dy/hr/mi */ + seconds =ReadDouble(infile); /* seconds */ + speed =ReadDouble(infile); /* speed in knots */ + course =ReadDouble(infile); /* course in degrees */ + pdop =ReadDouble(infile); /* dilution of precision */ + gpsfix =fgetc(infile); /* fix type x08,x10, x20 */ + gpsvalid =fgetc(infile); /* fix is valid */ + gpssats =fgetc(infile); /* number of sats */ + + wpt_tmp = waypt_new(); + + wpt_tmp->latitude =(latrad * 180) / M_PI; + wpt_tmp->longitude =(lonrad * 180) / M_PI; + wpt_tmp->altitude =elev; + + tmStruct.tm_year =timestamp[0]+100; + tmStruct.tm_mon =timestamp[1]-1; + tmStruct.tm_mday =timestamp[2]; + tmStruct.tm_hour =timestamp[3]; + tmStruct.tm_min =timestamp[4]; + tmStruct.tm_sec =(int)floor(seconds); + tmStruct.tm_isdst =-1; + + wpt_tmp->creation_time = mkgmtime(&tmStruct); + wpt_tmp->centiseconds = fmod(100*seconds+0.5,100); + + wpt_tmp->shortname =xcalloc(16,1); + snprintf(wpt_tmp->shortname, 15 , "WP%04d", ++serial); + + wpt_tmp->speed = speed*kts2mps; /* meters per second */ + wpt_tmp->course = course; + wpt_tmp->pdop = pdop; + + /* + GPS Fix data + */ + if (gpsvalid&0x7) { + if (gpsfix==0) + wpt_tmp->fix =fix_none; + if (gpsfix&0x8) + wpt_tmp->fix =fix_2d; + else if (gpsfix&0x10) + wpt_tmp->fix =fix_3d; + else if (gpsfix&0x20) + wpt_tmp->fix =fix_dgps; + else + wpt_tmp->fix =fix_unknown; + + /* */ + wpt_tmp->sat = gpssats; + } + else + wpt_tmp->fix =fix_unknown; + + if (doing_wpts) /* process as waypoints */ + { + waypt_add(wpt_tmp); + } + else if (doing_rtes) /* process as route */ + { + if (route_head == NULL) { + route_head = route_head_alloc(); + route_add_head(route_head); + } + route_add_wpt(route_head, wpt_tmp); + } + else /* default track mode */ + { + if (route_head == NULL) { + route_head = route_head_alloc(); + track_add_head(route_head); + } + route_add_wpt(route_head, wpt_tmp); + } + + xfree(timestamp); + + count--; + } +} + +static void +wr_init(const char *fname) +{ + warning(MYNAME " write: format is experimental and may crash Vito Navigator II.\n"); + ofs = xfopen(fname, "wb", MYNAME); +} + +static void +wr_deinit(void) +{ + fclose(ofs); + +} + +static void +vitosmt_waypt_pr(const waypoint *waypointp) +{ + unsigned char * workbuffer =0; + size_t position =0; + struct tm* tmstructp =0; + double seconds =0; + + ++count; + workbuffer = xcalloc(vitosmt_datasize,1); + + WriteDouble(&workbuffer[position], (M_PI*waypointp->latitude)/180 ); + position += sizeof(double); + WriteDouble(&workbuffer[position], (M_PI*waypointp->longitude)/180 ); + position += sizeof(double); + if ( waypointp->altitude-1 > unknown_alt) + WriteDouble(&workbuffer[position], waypointp->altitude ); + position += sizeof(double); + + tmstructp = gmtime(&waypointp->creation_time); + seconds = (double) tmstructp->tm_sec + 0.01*waypointp->centiseconds; + + workbuffer[position++] =tmstructp->tm_year-100; + workbuffer[position++] =tmstructp->tm_mon+1; + workbuffer[position++] =tmstructp->tm_mday; + workbuffer[position++] =tmstructp->tm_hour; + workbuffer[position++] =tmstructp->tm_min; + + WriteDouble(&workbuffer[position], seconds ); + position += sizeof(double); + + /* speed */ + if (waypointp->speed>0) + WriteDouble(&workbuffer[position], waypointp->speed / mph2mps ); + position += sizeof(double); + + /* course */ + if ((waypointp->course>=-360.0)&&(waypointp->course<=360.0)) + WriteDouble(&workbuffer[position], waypointp->course ); + position += sizeof(double); + + /* pdop */ + if (waypointp->pdop>0) + WriteDouble(&workbuffer[position], waypointp->pdop ); + position += sizeof(double); + + + /* fix type */ + switch (waypointp->fix) + { + case fix_2d: + workbuffer[position++] = 0x08; + break; + case fix_3d: + workbuffer[position++] = 0x10; + break; + case fix_dgps: + workbuffer[position++] = 0x20; + break; + default: + workbuffer[position++] = 0; + break; + } + + /* Assume position is valid */ + workbuffer[position++] = 0x07; + + if ((waypointp->sat>0)&&(waypointp->sat<128)) + workbuffer[position++] = waypointp->sat; + else + workbuffer[position++] = 0; + + if (fwrite(workbuffer,vitosmt_datasize,1,ofs)!=1) + { + fatal("%s (%d) writing output file. Error was '%s'.\n", + MYNAME, __LINE__, strerror(errno)); + } + + xfree(workbuffer); +} + + +static void +vitosmt_write(void) +{ + time_t now = 0; + unsigned char * workbuffer =0; + size_t position =0; + + workbuffer = xcalloc(vitosmt_headersize,1); + + now = current_time(); + count = 0; + position = 0; + + /* leave a spacer for the header */ + memset(workbuffer,0,vitosmt_headersize); + if (fwrite(workbuffer,vitosmt_headersize,1,ofs)!=1) + { + fatal("%s (%d) writing output file. Error was '%s'.\n", + MYNAME, __LINE__, strerror(errno)); + } + + if (doing_wpts) /* process as waypoints */ + { + waypt_disp_all(vitosmt_waypt_pr); + } + else if (doing_rtes) /* process as route */ + { + route_disp_all(NULL, NULL, vitosmt_waypt_pr); + } + else /* default track mode */ + { + track_disp_all(NULL, NULL, vitosmt_waypt_pr); + } + + + /* write the complete the header */ + le_write32(&workbuffer[position],vitosmt_version); + position += sizeof(gbuint32); + le_write32(&workbuffer[position],vitosmt_subversion); + position += sizeof(gbuint32); + le_write32(&workbuffer[position],count); + position += sizeof(gbuint32); + le_write32(&workbuffer[position],0); + position += sizeof(gbuint32); + le_write32(&workbuffer[position],count-1); + position += sizeof(gbuint32); + le_write32(&workbuffer[position],count); + position += sizeof(gbuint32); + + rewind(ofs); + if (fwrite(workbuffer,vitosmt_headersize,1,ofs)!=1) + { + fatal("%s (%d) writing output file. Error was '%s'.\n", + MYNAME, __LINE__, strerror(errno)); + } + + xfree(workbuffer); +} + +ff_vecs_t vitosmt_vecs = { + ff_type_file, + FF_CAP_RW_ALL, + rd_init, + wr_init, + rd_deinit, + wr_deinit, + vitosmt_read, + vitosmt_write, + NULL, + NULL +}; diff --git a/vtesto b/vtesto new file mode 100644 index 000000000..396b099b0 --- /dev/null +++ b/vtesto @@ -0,0 +1,9 @@ +#!/bin/sh + +# +# Run our testsuite under valgrind. Mostly it complains about core GNU libc +# functions, but it does actually help find interesting stuff in our own code +# from time to time. +# + +PNAME="valgrind -q ./gpsbabel" ./testo diff --git a/waypt.c b/waypt.c index 14bbad644..f86958e3a 100644 --- a/waypt.c +++ b/waypt.c @@ -1,7 +1,7 @@ /* Perform various operations on waypoints. - Copyright (C) 2002 Robert Lipe, robertlipe@usa.net + Copyright (C) 2002-2005 Robert Lipe, robertlipe@usa.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,6 +36,9 @@ waypt_init(void) waypoint * waypt_dupe(const waypoint *wpt) { + /* + * This and waypt_free should be closely synced. + */ waypoint * tmp; tmp = waypt_new(); memcpy(tmp, wpt, sizeof(waypoint)); @@ -54,22 +57,25 @@ waypt_dupe(const waypoint *wpt) tmp->icon_descr = xstrdup(wpt->icon_descr); if (wpt->gc_data.desc_short.utfstring) { tmp->gc_data.desc_short.utfstring = - xstrdup(tmp->gc_data.desc_short.utfstring); + xstrdup(wpt->gc_data.desc_short.utfstring); } if (wpt->gc_data.desc_long.utfstring) { tmp->gc_data.desc_long.utfstring = - xstrdup(tmp->gc_data.desc_long.utfstring); + xstrdup(wpt->gc_data.desc_long.utfstring); } + if (wpt->gc_data.placer) { + tmp->gc_data.placer = xstrdup(wpt->gc_data.placer); + } + if (wpt->gc_data.hint) { + tmp->gc_data.hint = xstrdup(wpt->gc_data.hint); + } + /* * It's important that this duplicated waypoint not appear * on the master Q. */ tmp->Q.next = tmp->Q.prev = NULL; - tmp->gpx_extras = NULL; - if ( wpt->an1_extras ) { - wpt->an1_extras->copy((void **)(&tmp->an1_extras), - (void *)wpt->an1_extras ); - } + tmp->fs = fs_chain_copy( wpt->fs ); return tmp; } @@ -85,7 +91,6 @@ waypt_add(waypoint *wpt) * try to be sure that we have these fields even if just by * copying them from elsewhere. */ - if (wpt->shortname == NULL) { if (wpt->description) { wpt->shortname = xstrdup(wpt->description); @@ -129,6 +134,10 @@ waypt_new(void) wpt = (waypoint *) xcalloc(sizeof (*wpt), 1); wpt->altitude = unknown_alt; + wpt->course = -999.0; + wpt->speed = -999.0; + wpt->fix = fix_unknown; + wpt->sat = -1; return wpt; } @@ -247,6 +256,9 @@ find_waypt_by_name(const char *name) void waypt_free( waypoint *wpt ) { + /* + * This and waypt_dupe should be closely synced. + */ if (wpt->shortname) { xfree(wpt->shortname); } @@ -265,9 +277,6 @@ waypt_free( waypoint *wpt ) if (wpt->icon_descr && wpt->wpt_flags.icon_descr_is_dynamic) { xfree((char *)(void *)wpt->icon_descr); } - if (wpt->gpx_extras) { - free_gpx_extras(wpt->gpx_extras); - } if (wpt->gc_data.desc_short.utfstring) { xfree(wpt->gc_data.desc_short.utfstring); } @@ -277,10 +286,10 @@ waypt_free( waypoint *wpt ) if (wpt->gc_data.placer) { xfree(wpt->gc_data.placer); } - if ( wpt->an1_extras ) { - (*(wpt->an1_extras->destroy))((void *)wpt->an1_extras ); - xfree( wpt->an1_extras ); - } + if (wpt->gc_data.hint) { + xfree (wpt->gc_data.hint); + } + fs_chain_destroy( wpt->fs ); xfree(wpt); } @@ -292,6 +301,7 @@ waypt_flush( queue *head ) QUEUE_FOR_EACH(head, elem, tmp) { waypoint *q = (waypoint *) dequeue(elem); waypt_free(q); + waypt_ct--; } } diff --git a/xmlgeneric.c b/xmlgeneric.c index 9aaf23173..f9877da1f 100644 --- a/xmlgeneric.c +++ b/xmlgeneric.c @@ -180,11 +180,6 @@ xml_cdata(void *dta, const XML_Char *s, int len) estr = (char *) cdatastr.mem + strlen(cdatastr.mem); memcpy(estr, s, len); estr[len] = 0; - - cb = xml_tbl_lookup(current_tag.mem, cb_cdata); - if (cb) { - (*cb)(estr, NULL); - } } static void @@ -196,6 +191,10 @@ xml_end(void *data, const char *el) if (strcmp(s + 1, el)) { fprintf(stderr, "Mismatched tag %s\n", el); } + cb = xml_tbl_lookup(current_tag.mem, cb_cdata); + if (cb) { + (*cb)( (char *) cdatastr.mem, NULL); + } cb = xml_tbl_lookup(current_tag.mem, cb_end); if (cb) { @@ -232,7 +231,7 @@ void xml_readstring( char *str ) } void -xml_init(const char *fname, xg_tag_mapping *tbl) +xml_init(const char *fname, xg_tag_mapping *tbl, const char *encoding) { if (fname) { ifd = xfopen(fname, "r", MYNAME); @@ -241,7 +240,7 @@ xml_init(const char *fname, xg_tag_mapping *tbl) current_tag = vmem_alloc(1,0); *((char *)current_tag.mem) = '\0'; - psr = XML_ParserCreate(NULL); + psr = XML_ParserCreate((const XML_Char *)encoding); if (!psr) { fatal(MYNAME ": Cannot create XML Parser\n"); } diff --git a/xmlgeneric.h b/xmlgeneric.h index 35758b012..1042766c2 100644 --- a/xmlgeneric.h +++ b/xmlgeneric.h @@ -54,7 +54,7 @@ void xml_fill_in_time(char *time_string, const time_t timep, int long_or_short); void write_xml_header(FILE *ofd); -void xml_init(const char *fname, xg_tag_mapping *tbl); +void xml_init(const char *fname, xg_tag_mapping *tbl,const char *encoding); void xml_read(void); void xml_readstring(char *str); void xml_deinit(void); diff --git a/xmltag.c b/xmltag.c new file mode 100644 index 000000000..992ec4871 --- /dev/null +++ b/xmltag.c @@ -0,0 +1,131 @@ +/* + Functions to deal with xml_tags + + Copyright (C) 2005 Ron Parker and Robert Lipe. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#include +#include +#include + +#include "defs.h" + +void free_xml_tag( xml_tag *tag ) +{ + xml_tag *next = NULL; + char **ap; + + while ( tag ) { + if (tag->cdata) { + xfree(tag->cdata); + } + if (tag->child) { + free_gpx_extras(tag->child); + } + if (tag->parentcdata) { + xfree(tag->parentcdata); + } + if (tag->tagname) { + xfree(tag->tagname); + } + if (tag->attributes) { + ap = tag->attributes; + + while (*ap) + xfree(*ap++); + + xfree(tag->attributes); + } + + next = tag->sibling; + xfree(tag); + tag = next; + } +} + +void copy_xml_tag( xml_tag **copy, xml_tag *src, xml_tag *parent ) { + xml_tag *res = NULL; + char **ap = NULL; + char **ap2 = NULL; + int count = 0; + + if ( !src ) { + *copy = NULL; + return; + } + + res = xcalloc( 1, sizeof(xml_tag)); + *copy = res; + + memcpy( res, src, sizeof(xml_tag)); + res->tagname = xstrdup( src->tagname ); + res->cdata = xstrdup( src->cdata ); + res->parentcdata = xstrdup( src->parentcdata ); + if ( src->attributes ) { + ap = src->attributes; + while ( *ap ) { + count++; + ap++; + } + res->attributes = (char **)xcalloc( count+1, sizeof(char *)); + ap = src->attributes; + ap2 = res->attributes; + while (*ap) { + *ap2 = xstrdup(*ap); + ap++; + ap2++; + } + } + res->parent = parent; + copy_xml_tag( &(res->sibling), src->sibling, parent ); + copy_xml_tag( &(res->child), src->child, res ); +} + +fs_xml *fs_xml_alloc( long type ); + +void fs_xml_destroy( void *fs ) { + fs_xml *xml = (fs_xml *)fs; + if ( xml ) { + free_xml_tag( xml->tag ); + } + xfree( fs ); +} + +void fs_xml_copy( void **copy, void *source ) { + fs_xml *src = (fs_xml *)source; + if ( !source ) { + *copy = NULL; + return; + } + *copy = (void *)fs_xml_alloc( src->fs.type ); + memcpy( *copy, source, sizeof(fs_xml) ); + copy_xml_tag( &(((fs_xml *)(*copy))->tag), src->tag, NULL ); +} + + +fs_xml *fs_xml_alloc( long type ) { + fs_xml *result = NULL; + + result = (fs_xml *)xcalloc( 1, sizeof(fs_xml)); + result->fs.type = type; + result->fs.copy = fs_xml_copy; + result->fs.destroy = fs_xml_destroy; + return result; +} + + -- 2.30.2